【问题标题】:Mongoose 5 async connection troubleMongoose 5 异步连接问题
【发布时间】:2019-11-23 00:26:09
【问题描述】:

根据this,在初始连接期间处理错误的正确方法是这样的:

try {
  await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
} catch (error) {
  handleError(error);
}

很遗憾,这会导致 SyntaxError:

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

SyntaxError: Unexpected identifier

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

mongoose.connect(mongoConnectionString, {
       useNewUrlParser: true
     })
       .then(() => console.log('MongoDB Connected'))
       .catch(err => console.log(err));
   });

package.json 中的依赖: "mongoose": "^5.6.0"

index.js:

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);
}

那么这里的await 有什么问题?

【问题讨论】:

    标签: node.js asynchronous mongoose async-await


    【解决方案1】:

    mongoose异步操作,它支持promise默认运行异步它不需要等待函数,因为它成功使用时是异步的然后(()=>“连接时应该做什么)如果它出错使用catch( ()=>“发生错误时发生了什么),您应该使用关键字来使用async,以启动要作为异步函数示例运行的函数 常量 a=异步函数(){ await ///这是什么等待需要支配

    【讨论】:

    • 好吧,根据官方 mongoosejs.com/docs,对初始 mongoose.connect 使用 await 是建议的正确错误处理方法之一,所以我不想争论是否需要它或不。这并不能回答为什么 await 不起作用的问题。
    • @Hans await 不起作用,因为您在非异步函数中使用它。您不能在尚未声明为async 的函数中使用await。使用thencatch| is equivalent to using await` btw;它们只是做同一件事的两种不同语法。
    • @Paulpro 感谢您的评论。如果它是一个非异步函数,我不明白如何建议在官方 mongoose 资源上使用 await。您确定吗? await 和 then/catch 可以等效,但如果您真的想停止并且在返回 Promise 之前不让其他代码执行,则不是。在初始连接的情况下,真正停止而不继续进行其他任何操作是有意义的。
    • @Hans 不管你想不想停止都不会改变awaitthen 做同样事情的事实。他们都没有停止/阻止事件循环。
    • @Hans 文档只是没有显示上下文。带有await 的代码运行良好,但它必须在async 函数内。 await 是其他任何地方的语法错误,直到 EcmaScript 的未来版本一旦 github.com/tc39/proposal-top-level-await 通过。那么它仍然是非异步函数内部的语法错误,但在所有函数之外的模块中都是允许的。
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多