質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • CentOS

    2718questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Node.js

    1873questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • MongoDB

    245questions

    MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

node mongo.jsでthrow err;が出る

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 747

kasaburanka

score 128

お世話になります
DotinstallでNode.jsを勉強中です
15章 https://dotinstall.com/lessons/basic_nodejs/26215の部分ですが
下記のようなエラーが出ます
よく理解できずに困っています
ご指導頂きたいです
[vagrant@localhost nodejs]$ node mongo.js
connected to db
/home/vagrant/nodejs/node_modules/mongodb/lib/mongo_client.js:797
throw err;
^

TypeError: db.collection is not a function
at /home/vagrant/nodejs/mongo.js:6:8
at args.push (/home/vagrant/nodejs/node_modules/mongodb/lib/utils.js:431:72)
at /home/vagrant/nodejs/node_modules/mongodb/lib/mongo_client.js:254:5
at connectCallback (/home/vagrant/nodejs/node_modules/mongodb/lib/mongo_client.js:933:5)
at /home/vagrant/nodejs/node_modules/mongodb/lib/mongo_client.js:794:11
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
[vagrant@localhost nodejs]$  throw err;

(settings.js)
exports.port = 1337;
exports.host = '192.168.33.10';
exports.db = 'nodedb';

(mongo.js)

var MongoClient = require('mongodb').MongoClient,
    settings = require('./settings');
MongoClient.connect("mongodb://localhost/"+settings.db, function(err, db) {
    if (err) { return console.dir(err); }
    console.log("connected to db");
    db.collection("users", function(err, collection) {
        var docs = [
            {name: "taguchi", score: 40},
            {name: "fkoji", score: 80},
            {name: "dotinstall", score: 60}
        ];
        collection.insert(docs, function(err, result) {
            console.dir(result);
        });
    });
});
コード


(server.js)

var http = require('http'),
    fs = require('fs'),
    ejs = require('ejs'),
    qs = require('querystring');
var settings = require('./settings');
var server = http.createServer();
var template = fs.readFileSync(__dirname + '/public_html/bbs.ejs', 'utf-8');
var posts = [];
function renderForm(posts, res) {
    var data = ejs.render(template, {
        posts: posts
    });
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    res.end();
}
server.on('request', function(req, res) {
    if (req.method === 'POST') {
        req.data = "";
        req.on("data", function(chunk) {
            req.data += chunk;
        });
        req.on("end", function() {
            var query = qs.parse(req.data);
            posts.push(query.name);
            renderForm(posts, res);
        });
    } else{
        renderForm(posts, res);
    }
});
server.listen(settings.port, settings.host);
console.log("server listening ...");
コード


このようになっています。
よろしくお願いいたします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

コードが正しくない可能性が高いです。

db.collection()

のようにされていることに不満があるとTypeErrorが出ています。
関数として何かしらの理由で定義されていないか、dbに何かあったのかもしれません。

コードがあればもう少し理解が進むかもしれません。


追記:

const assert = require('assert');
const MongoClient = require('mongodb').MongoClient,
      settings = require('./settings');

MongoClient.connect("mongodb://localhost/"+settings.db, function(err, client) {
    if (err) { return console.dir(err); }
    console.log("connected to server");
    const db = client.db('nodedb');
    db.collection("users", function(err, collection) {
          assert.equal(err, null);
        var docs = [
            {name: "taguchi", score: 40},
            {name: "fkoji", score: 80},
            {name: "dotinstall", score: 60}
        ];
        collection.insert(docs, function(err, result) {
            console.dir(result);
        });
    });
    client.close();
});

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/13 09:04

    有難うございます。コードを追加しましたのでよろしくお願い致します

    キャンセル

  • 2017/12/13 19:55 編集

    カッコ部分は誤りでした。

    原因はわかりましたが、結構面倒なことであることもわかりました。

    mongodbのバージョンのせいですね。
    npmでインストールされる方のですので、正しくはnode-mongodb-nativeです。
    がnpmではmongodbとして登録されているので以後そのように記述します。

    npmで普通にインストールされるmongodb3.x以降はユーザー認証がないとセキュリティ上に不安があるとして、データベースに接続できません。


    解決法としては2つあります。
    1. mongodb3.xをアンインストールしてmongodb2.xを使用する
    (2. mongodb3.xでユーザー認証がある場合の使用法をマスターする)
    です。

    https://stackoverflow.com/questions/15890958/how-do-i-install-a-previous-version-of-an-npm-package
    このページを見ればnpmを用いた過去のバージョンのインストール方法がわかるようになります。

    1.の一例として、
    現バージョンを見る。
    $ npm ls
    現バージョンをアンインストール。
    $ npm uninstall mongodb
    過去バージョンの具合を調べる。
    $ npm view mongodb versions --json
    過去バージョンをインストール。
    $ npm install mongodb@2.2.33

    それで走るようになるはずです。

    キャンセル

  • 2017/12/13 23:59

    と思っていましたが、古いバージョンに下げるのはよろしくないといろいろ試してみた結果、
    https://stackoverflow.com/questions/43779323/typeerror-db-collection-is-not-a-function
    にたどり着きました。

    どうやらv3.0からcallbackに入ってくるオブジェクトに変更があったようです。
    .db('nodedb')としてデータベースオブジェクトを一度取り出してからだとうまくいきます。

    動くコードを貼り付けますので、回答の追記を参照してください。

    キャンセル

  • 2017/12/14 00:06

    よくよく読んでみたら、公式ドキュメントでもしれっと書かれていました。
    http://mongodb.github.io/node-mongodb-native/3.0/quick-start/quick-start/

    MongoClientなのにdbを返すのは気になったようですね。
    HelloWorld的なところに変更を加えるなんて恐るべし……

    キャンセル

  • 2017/12/14 10:19

    ありがとうございます。varとconstの使い分けも分かりました。v3.6なので、
    callbackに入ってくるオブジェクトに変更があったこの部分は理解していましたが分かりやすい説明い有難うございます。サポート切れの為質問が出来ない状態でした。やはりまだまだですSchooの録画を見たりしていますがなかなか難しいと感じていました。本当に有難うございました

    キャンセル

0

db.collection is not a functionと出ているので関数じゃないと怒られていますね。
全体のソースコードを見せていただいたらなぜエラーが出ているのか詳しくわかりそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/13 09:03

    ありがとうございます。修正してコードを追加しました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • CentOS

    2718questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Node.js

    1873questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • MongoDB

    245questions

    MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。