Promise解决后将响应发送给客户端-Adonis,Node.js

时间:2018-08-22 18:35:05

标签: node.js promise

我有一些诺言

getSomeInfo(data) {
    return new Promise((resolve, reject) => {
      /* ...some code... */

      someObject.getData((err, info) => {
        if (info) {
          resolve(info)
        }
        else {
          reject("Error")
        }
      })
    })
  }

我使用了这个承诺,并希望从Controller(AdonisJS)向客户端发送响应:

async create ({ request, response }) {
        this.getSomeInfo(data).then(info => {
              console.log(info) // It's work, i get the data from promise

              response.status(201).json({ // but this is not work
                code: 201,
                message: "Data received!",
                data: info
              })
            })
}

为什么响应不起作用?

3 个答案:

答案 0 :(得分:1)

只需这样做。

async create ({ request, response }) {
    const info = await this.getSomeInfo(data)
    console.log(info)

    response.status(201).json({
        code: 201,
        message: "Data received!",
        data: info
    })
}

答案 1 :(得分:0)

如果console.log(info)中的create()可以正常工作并显示所需的数据,但是response.status(201).json(...)没有发送响应,那么我可以看到以下可能性:

  1. 您已经发送了对此请求的响应(因此无法发送其他请求)
  2. .json()方法无法将info转换为JSON(可能是由于循环引用),并且引发异常。
  3. 您没有正确传递参数requestresponse,因此response不是应该的。

您可以像这样测试第二种情况:

create ({ request, response }) {
    this.getSomeInfo(data).then(info => {
        console.log(info) // It's work, i get the data from promise

        response.status(201).json({ // but this is not work
            code: 201,
            message: "Data received!",
            data: info
        });
    }).catch(e => {
        console.log("Error in create()", e);
        response.sendStatus(500);
    });
}

此外,没有理由将此方法声明为async,因为您没有显示正在使用awaitasync函数的任何功能。


在注释中,您说此功能直接由路由器(我假设为Express路由器)调用。如果真是这样,那么函数参数就不能正确地声明,因为它们是作为两个单独的参数而不是作为对象的属性出现的。将函数声明更改为此:

create (request, response) { ... }

答案 2 :(得分:0)

将一个函数标记为async时,该函数必须返回一个Promise,这可以显式完成。

async create({ request, response }) {
    return this.getSomeInfo(data).then(info => {
        console.log(info) // It's work, i get the data from promise

        response.status(201).json({ // but this is not work
            code: 201,
            message: "Data received!",
            data: info
        })
    })
}

或隐式使用await关键字。

async create({ request, response }) {
    const info = await this.getSomeInfo(data)
    console.log(info) // It's work, i get the data from promise

    response.status(201).json({ // but this is not work
        code: 201,
        message: "Data received!",
        data: info
    })
}