私はMEAN Stackでアプリケーションを構築するのが初めてです。リアルタイムチャットアプリを構築しようとしています。これがサーバーサイドです。
console.log("Server running...!");
var mongo=require('mongodb').MongoClient;
var client=require('socket.io').listen(8080).sockets;
mongo.connect('localhost:27017/db/chat',function(err,db){
if(err) throw err;
client.on('connection',function(socket){
console.log('someone has connected !');
//waiting for input
socket.on('input',function(data){
console.log(data);
});
});
});
私はmongodbとのチャットと呼ばれるデータベースを作成したと確信しています。また、mongoも接続を待っています。しかし、ノードserver.jsでサーバーを実行すると、エラーが発生します:
Server running...!
C:\Users\azus\Desktop\Psirt\codemaster\node_modules\ mongodb\lib\url_parser.js:20
throw new Error('invalid schema, expected mongodb');
^
Error: invalid schema, expected mongodb
at module.exports (C:\Users\azus\Desktop\Psirt\code-master\node_modules\mong
odb\lib\url_parser.js:20:11)
at connect (C:\Users\azus\Desktop\Psirt\code-master\node_modules\mongodb\lib
\mongo_client.js:125:16)
at Function.MongoClient.connect (C:\Users\azus\Desktop\Psirt\code-master\nod
e_modules\mongodb\lib\mongo_client.js:109:3)
at Object.<anonymous> (C:\Users\azus\Desktop\Psirt\code-master\server.js:6:8
)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:139:18)
C:\Users\azus\Desktop\Psirt\code-master>
私はこのフェーズで数週間ブロックされていましたが、誰か助けていただけますか?
ありがとう。
これは、不適切な形式の接続文字列を使用しているためです。
localhost:27017/db/chat
でなければならないのにmongodb://localhost:27017/db/chat
を使用しています
接続文字列のパターンはmongodb://<HOSTNAME>:<PORT>/<DBNAME>
です
参考記事: https://mongodb.github.io/node-mongodb-native/api-generated/mongoclient.html#mongoclient-connect
私もこの問題を抱えていましたが、それはプロトコルが間違っていたためでした:
mongo://localhost:27017/test
プロトコルが間違っていると、このエラーが発生する可能性もあります。次のようになります。
mongodb://localhost:27017/test
環境変数を引用符で囲むとエラーが発生する場合があります。それらを一度削除してから試してください。役立つかもしれません。
エラーがある可能性があります:
set DATABASE_URI='mongodb://localhost:1000/my_app' && node index.js
正しいコマンドは次のとおりです。
set DATABASE_URI=mongodb://localhost:1000/my_app && node index.js
これを試してください、それは動作します:
mongoose.connect('mongodb://localhost:27017/shopping');
同じ問題を見つけました。ダムウィンドウは環境に引用を保存します。
したがって、Windowsを使用してこの方法で記述した場合はSET MONGO_URL="mongodb://localhost:27017/{name of your db}"
正しくありません。
正しい方法はSET MONGO_URL=mongodb://localhost:27017/{name of your db}
引用符なし。
また、プロトコルを正確に記述する必要があることを発見しました-mongodb。ファイルurl_parser.jsからプロトコルをチェックするコードがあります
var result = parser.parse(url, true);
if(result.protocol != 'mongodb:') {
throw new Error('invalid schema, expected mongodb');
}
当たり前のように思えるかもしれませんが、一般に無効な値をmongoクライアントに渡すと、このエラーが発生します。 undefined
。私が設定オブジェクトの間違ったキーを参照していたときにこれに走りました。
この行の内容を
mongo.connect('localhost:27017/db/chat',function(err,db)
に
mongo.connect('mongodb://localhost:27017/db/chat',function(err,db)
その後、MongoDBデータベースに正常に接続できます。
作業コードは次のようになります
username
、password
&URL
を置き換えることを忘れないでください
const socketClient = require('socket.io').listen(4000).sockets;
const MongoClient = require('mongodb').MongoClient;
const uri = "mongodb+srv://<username>:<password>@cluster0-saugt.mongodb.net/test?retryWrites=true&w=majority";
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect(err => {
socketClient.on('connection', function (socket) {
//Need to Get the Database first before trying to access the collections.
let chat = client.db("test").collection('chats');
// Get chats from mongo collection
// perform actions on the collection object
chat.find().limit(100).sort({ _id: 1 }).toArray(function (err, res) {
if (err) {
throw err;
}
// Emit the messages
socket.emit('output', res);
});
});
});