簡體   English   中英

構造json響應。 NodeJS發送空響應

[英]Constructing json response. NodeJS send empty response

我有此代碼,我想在其中發送包含通過多次請求數據庫獲得的數據的響應。 我不明白為什么它會發送空響應。

var express = require('express'),
router = express.Router(),
database = require('../database');

router.get('/', function(req, res, next){

  res.writeHead(200, {"Content-Type": "application/json"});

    var ttt;
    var yyy;

    database.getTagType().then(function(data) {
        ttt = "pfff";
    });

    database.getSpecie().then(function(data) {
        yyy = "akkhhh";
    });

  var json = JSON.stringify({
    anObject: ttt, 
    anArray: yyy, 
  });
  res.end(json);

});

module.exports = router;

問題是Promise.then異步性質。 您會看到,在兩個諾言都將被解決之前,將調用JSON.stringifyres.end 若要僅在獲取所有數據時發送響應,則必須使用Promise.all方法。

這是一個如何完成的示例:

router.get('/', function(req, res, next){
    var promises = [];

    promises.push(database.getTagType().then(function(data){
        return "pfff";
    }));

    promises.push(database.getSpecie().then(function(data) {
        return "akkhhh";
    }));

    Promise.all(promises).then(function(values) {
        // Actually, express can stringify response for us. Also it adds
        // correct "Content-Type" header.
        res.json({
            anObject: values[0], 
            anArray: values[1]
        });
    }).catch(function(error) {
        // Something went wrong. Let the error middleware deal with the problem.
        next(error);
        // Instead we can just send an error response, like so:
        // res.status(500).json({error: error.toString()});
    });
});

數據庫調用是異步的。 它們正在返回promise,並且您要追加then函數,但是javascript運行的方式是,該函數調用getTagTypegetSpecie ,然后在promise解決且db調用結束之前發送帶有res.end()的響應。

您需要確保等待所有promise解析后再回復響應,這本質上要求嵌套then()函數。

像這樣:

router.get('/', function(req, res, next){

  res.writeHead(200, {"Content-Type": "application/json"});

    var tag = database.getTagType();
    // `tag` is now a promise

    var specie = database.getSpecie();
    // `specie` is a promise

    Promise.all([tag, specie]).then(function(values) {
    // this code is executed once both promises have resolved, the response has come back from the database

        var json = JSON.stringify({
            tag: values[0],
            specie: values[1]
        )};

        res.end(json);
    });
});

此函數將立即返回,但在數據庫調用完成之前不會調用res.end()

一旦將async/await添加到語言中,此代碼將變得更干凈:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM