Node.js Express生产服务器中的异步等待vs回调

Node.js Express生产服务器中的异步等待vs回调,node.js,express,Node.js,Express,我正在阅读express中给出的生产最佳实践,其中提到不要使用同步函数。现在,早些时候我曾经这样编写我的控制器: 没有异步等待,只有回调 exports.getSubjectById=(请求、回复)=>{ const subjectId=req.query.subjectId; 芬顿({ 主观性的:主观性的 },功能(错误,主题)=>{ 如果(错误){ 返回res.status(400).json(err); } 返回res.status(200).json(主题); }); } 然后我开始使

我正在阅读express中给出的生产最佳实践,其中提到不要使用同步函数。现在,早些时候我曾经这样编写我的控制器:

  • 没有异步等待,只有回调
  • exports.getSubjectById=(请求、回复)=>{
    const subjectId=req.query.subjectId;
    芬顿({
    主观性的:主观性的
    },功能(错误,主题)=>{
    如果(错误){
    返回res.status(400).json(err);
    }
    返回res.status(200).json(主题);
    });
    }
    
  • 然后我开始使用async编写这样的代码,但不使用Wait和回调
  • exports.getSubjectById=async(req,res)=>{
    const subjectId=req.query.subjectId;
    芬顿({
    主观性的:主观性的
    },功能(错误,主题)=>{
    如果(错误){
    返回res.status(400).json(err);
    }
    返回res.status(200).json(主题);
    });
    }
    
  • 然后我最终编写了这个异步等待,没有回调
  • exports.getSubjectById=async(req,res)=>{
    const subjectId=req.query.subjectId;
    const subject=等待subject.findOne({
    主观性的:主观性的
    });
    如果(!主题){
    返回res.status(404.json)({
    错误:“找不到此id的主题”
    })
    }否则{
    返回res.status(200).json(主题);
    }
    }
    

    有谁能告诉我应该使用哪一种方法作为生产最佳实践以及这些方法之间的区别吗?

    解决方案3是好的,而且最重要的是,是正确的实践。访问数据库本身是异步的,它返回一个承诺。如果您使用async/await,它将准确地返回您所请求的内容。你也可以编写简单的测试,例如,每个执行的速度……/p>在这种情况下,3号更好,但是你需要考虑异常情况。 所以,在调用异步函数时,需要添加try-catch

    exports.getSubjectById=async(req,res)=>{
    const subjectId=req.query.subjectId;
    试一试{
    const subject=等待subject.findOne({
    主观性的:主观性的
    });
    如果(!主题){
    返回res.status(404.json)({
    错误:“找不到此id的主题”
    })
    }否则{
    返回res.status(200).json(主题);
    }
    }捕获(错误){
    //异常,查询数据时可能db被破坏
    console.log(错误);
    返回资源状态(500).结束(“异常”)
    }
    }
    
    关于不要使用同步,您可以看一个示例。
    如果我希望api在5秒延迟后发送响应,我应该怎么做

    在Java中,您可以使用sleep(5)来延迟。
    因此,在编写node.js时,可以使用以下代码

    exports.getSubjectById=async(req,res)=>{
    const startTime=new Date().getTime()
    while(new Date().getTime()-startTime<5000){}
    资源状态(200)。发送(“成功”)
    }
    
    它可以工作,但会阻塞线程。
    在node.js中,您应该使用
    setTimeout
    模拟延迟5秒

    exports.getSubjectById=async(req,res)=>{
    设置超时(()=>{
    资源状态(200)。发送(“成功”)
    }, 5000)
    }
    
    上面的示例中,
    while loop
    是同步函数。
    但是
    setTimeout
    是异步函数。

    由于node.js的机制,你应该使用异步函数而不是同步函数。

    他们说不要使用
    synchronous
    函数,不要使用
    aschronous
    @Anatoly,你能告诉我应该使用哪一个吗?不管怎样,最后一个看起来很好,这正是我想要的。谢谢:)我还更新了关于为什么避免在node.js中使用同步函数的答案。