Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose 5异步连接故障_Node.js_Asynchronous_Mongoose_Async Await - Fatal编程技术网

Node.js Mongoose 5异步连接故障

Node.js Mongoose 5异步连接故障,node.js,asynchronous,mongoose,async-await,Node.js,Asynchronous,Mongoose,Async Await,根据,在初始连接期间处理错误的正确方法如下: try { await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true }); } catch (error) { handleError(error); } 不幸的是,这会导致语法错误: await mongoose.connect(mongoConnectionString, { useNewUrlParser: true });

根据,在初始连接期间处理错误的正确方法如下:

try {
  await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
} catch (error) {
  handleError(error);
}
不幸的是,这会导致语法错误:

await mongoose.connect(mongoConnectionString, { useNewUrlParser: true });
       ^^^^^^^

SyntaxError: Unexpected identifier
当我删除wait时,代码执行时没有任何问题。当我用谷歌搜索SyntaxError:Unexpected identifier和await时,我发现当await与非异步函数一起使用时会发生这种情况。但这没有任何意义,因为Mongoose从第5版开始使用asnyc connect。此外,以下异步代码也正常工作:

mongoose.connect(mongoConnectionString, {
       useNewUrlParser: true
     })
       .then(() => console.log('MongoDB Connected'))
       .catch(err => console.log(err));
   });
package.json中的依赖项: 猫鼬:^5.6.0

index.js:


那么wait在这里有什么问题呢?

mongoose异步操作,默认情况下,它支持promise运行async它不需要等待函数,因为它在成功使用时是异步的,然后=>当它连接时如果发生错误,应该做什么使用catch=>错误发生时发生了什么,并且您应该在启动要作为异步函数运行的函数示例中使用关键字to use wait wait这是异步的 常量a=异步函数{
wait///what is wait需要domming

根据官方的mongoosejs.com/docs,对初始mongoose.connect使用wait是正确处理错误的建议方法之一,因此我不想争论是否需要它。这并不能回答为什么wait不起作用的问题。@Hans wait不起作用,因为您正在非异步函数中使用它。您不能在未声明为异步的函数中使用wait。使用then和catch |等同于使用wait`btw;它们只是做同一件事的两种不同语法。@Paulpro感谢您的评论。我不明白如何建议在官方mongoose ressour上使用waitces,如果它是一个非异步函数。你确定吗?wait和then/catch可以是等效的,但如果你真的想暂停,并且在承诺返回之前不让其他代码执行,则不能。在初始连接的情况下,真正暂停,而不继续执行其他任何操作是有意义的。@Hans是否要暂停或停止not不会改变等待然后再执行相同操作的事实。它们都不会停止/阻止事件循环。@Hans文档只是没有显示上下文。带有WAIT的代码工作得很好,但它必须在异步函数中。在EcmaScript的未来版本通过之前,WAIT在任何其他地方都是语法错误。然后它将在非异步函数中仍然存在语法错误,但在所有函数之外的模块中都允许存在语法错误。
const express = require('express');
const app = express();
const mongoose = require('mongoose');
const mongoConnectionString = `mongodb://${process.env.MONGO_DB_USER}:${process.env.MONGO_DB_PW}@mongodb4711:27017/visitor-ips`;

initialMongoConnect(mongoose, mongoConnectionString);

function initialMongoConnect(mongoose, mongoConnectionString) { 
   try {
     await mongoose.connect(mongoConnectionString, { useNewUrlParser: true });

   } catch (error) {
     handleError(error, mongoose, mongoConnectionString);
   }
  console.log('Initial connect to MongoDB successful');
}

function handleError(error, mongoose, mongoConnectionString) {
   console.log('Error on initial connection: ' + error);
   // wait 3 seconds and try to do the initial connect again
   setTimeout(function() {initialMongoConnect(mongoose, mongoConnectionString)}, 3000);
}