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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

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

MongoDB

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

Node.js

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

Q&A

解決済

2回答

939閲覧

node mongo.jsでthrow err;が出る

Casablanca_mtg

総合スコア209

CentOS

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

MongoDB

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

Node.js

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

0グッド

0クリップ

投稿2017/12/12 04:58

編集2017/12/13 00:02

お世話になります
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 ..."); コード

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2017/12/12 13:44

TomokazuKozuma

総合スコア131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Casablanca_mtg

2017/12/13 00:03

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

0

ベストアンサー

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

node

1db.collection()

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

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


追記:

node

1const assert = require('assert'); 2const MongoClient = require('mongodb').MongoClient, 3 settings = require('./settings'); 4 5MongoClient.connect("mongodb://localhost/"+settings.db, function(err, client) { 6 if (err) { return console.dir(err); } 7 console.log("connected to server"); 8 const db = client.db('nodedb'); 9 db.collection("users", function(err, collection) { 10 assert.equal(err, null); 11 var docs = [ 12 {name: "taguchi", score: 40}, 13 {name: "fkoji", score: 80}, 14 {name: "dotinstall", score: 60} 15 ]; 16 collection.insert(docs, function(err, result) { 17 console.dir(result); 18 }); 19 }); 20 client.close(); 21});

投稿2017/12/12 07:11

編集2017/12/13 15:03
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Casablanca_mtg

2017/12/13 00:04

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

2017/12/13 15:07 編集

カッコ部分は誤りでした。 ( 原因はわかりましたが、結構面倒なことであることもわかりました。 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 それで走るようになるはずです。
mkgrei

2017/12/13 14:59

と思っていましたが、古いバージョンに下げるのはよろしくないといろいろ試してみた結果、 https://stackoverflow.com/questions/43779323/typeerror-db-collection-is-not-a-function にたどり着きました。 どうやらv3.0からcallbackに入ってくるオブジェクトに変更があったようです。 .db('nodedb')としてデータベースオブジェクトを一度取り出してからだとうまくいきます。 動くコードを貼り付けますので、回答の追記を参照してください。
Casablanca_mtg

2017/12/14 01:19

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問