nodejs api调用没有响应

Posted

技术标签:

【中文标题】nodejs api调用没有响应【英文标题】:nodejs api call is not responding 【发布时间】:2020-09-29 11:36:23 【问题描述】:

我是 JS 世界的新手,正在努力学习 NodeJs 基础知识,这就是我想要做的。

我的 mongoDb 中有一个联系人,编写一个 get 方法将其取回给调用者。简单吧?

这是我的路由器方法

import 
  getContact
 from '../controllers/crmController'
const routes = (app) => 
  app.route('/contact').get((req, res, next) => 
    console.log(`request URL $req.originalUrl`)
    console.log(`request method $req.method`)
    next()
  , getContact)

export default routes

这是我的客户控制器代码

import 
  getDbContact
 from '../data-access/crmDataAccess'
export const getContact = (req, res) => 
  console.log(`Controller calling db access`)
  var dbContact = getDbContact()
  console.log(`Controller Recieved $dbContact`)
  res.json(dbContact)

这是我通过 mongoose 访问的数据

import mongoose from 'mongoose'
import  ContactSchema  from '../models/crmModel'
const Contact = mongoose.model('Contact', ContactSchema)
export const getDbContact = () => 
  Contact.find(, (err, contact) => 
    if (err) 
      console.log(`Error $err`)
     else 
      console.log(`Contact Recieved $contact`)
      return contact
    
  )

从控制台日志中,我可以看到正在从数据库中获取数据,但它从未响应邮递员的呼叫。我想我在从控制器调用 db 访问方法时做错了什么.. 但很可疑,不知道是什么.. 有人可以帮帮我吗?谢谢

【问题讨论】:

(1) getDbContact 没有返回联系人,(2) getContact 没有正确处理承诺。 谢谢,你能把可以实现相同功能的代码扔在这里吗?基本上我希望这三层依次返回到路由器..! 【参考方案1】:

    你需要await getDbContact()(因为它是异步的),否则代码执行将通过,联系人将始终未定义

    getDbContact 必须返回一个 Promise 才能等待它。 Mongoose 方法是 Promise,你可以直接返回它。

    错误处理逻辑应该在控制器中,而不是在 DB 访问器中。

控制器:

export const getContact = async (req, res) =>  // add "async" so you can use "await" inside

    console.log(`Controller calling db access`)

    try 

        let dbContact = await getDbContact(); // use "let" or "const"; "var" is old-school all-purpose ES5
        console.log(`Controller Recieved `, dbContact); // dbContact is not a string. Log it this way
        res.json(dbContact);

     catch(err) 
        res.status(500).send(err);
    

数据库访问器:

export const getDbContact = () => Contact.find()
                 .lean() // returns simple JSON, faster
                 .exec() // non-blocking

【讨论】:

以上是关于nodejs api调用没有响应的主要内容,如果未能解决你的问题,请参考以下文章

NodeJ使用请求承诺来调用外部API,从响应主体中保存数据

使用 $.ajax jsonp 请求时,Nodejs api 响应未成功

如何在for循环中等待每次迭代并在nodeJS中将响应作为API响应返回

NodeJs:Paystack 验证响应

Android REST API 调用,后端没有响应新记录

在 jQuery 数据表中调用 ajax 时没有得到响应