2017-10-13 30 views
1

我仍在學習js,但我試圖在nodejs中編寫一個基本的服務器。 服務器應該接受查詢,然後從數據庫返回JSON。使用數據庫和服務器的承諾

我試圖使用承諾,但可以得到我的頭。 我的服務器返回一個空的答覆。 那麼我做錯了什麼?

我的服務器上的文件至今(簡體):

http.createServer(function (request, response) { 
    if (request.method === "GET") { 
    ... 
    var dbRes = dbFunc.getFromDB(query); 
    response.statusCode = 200; 
    response.setHeader('Content-Type', 'application/json'); 
    response.end(JSON.stringify(dbRes)); 
    } 
}).listen(port); 

我的數據庫文件至今(簡體):

exports.readHandeler = function (query) { 

    var promise = new Promise(function(resolve, reject) { 
    db.collection('data').find(query).toArray(function(err, res) { 
     if (err) { 
     throw err; 
     reject(-1); 
     } 
     resolve(res);  
    }  
    }); 

    promise.then(function(result) { 
    return result; 
    }, function(err) { 
    return -1; 
    }); 
} 

回答

0

我的服務器返回一個空應答。那麼我做錯了什麼?

您的dbRes將會是undefined,因爲您期待異步承諾執行的響應。只有在承諾解決後您才需要發送回覆。

使這改變了代碼

http.createServer(function (request, response) { 
    if (request.method === "GET") { 
    ... 
    dbFunc.getFromDB(query).then((dbRes) => { 
     response.statusCode = 200; 
     response.setHeader('Content-Type', 'application/json'); 
     response.end(JSON.stringify(dbRes)); 
    }).catch((err) => { 
     console.log('err', err.stack); 
    }); 

    } 
}).listen(port); 

此外,您還需要在數據庫執行部分返回承諾。

exports.readHandeler = function (query) { 
    return new Promise(function (resolve, reject) { 
    db.collection('data').find(query).toArray(function (err, result) { 
     if (err) { 
     return reject(err); // or -1 based on your need 
     } 
     return resolve(result); 
    }); 
    }); 
}; 
+0

Thx ill試試看,=>符號是什麼意思? – ortusolis

+0

這是一個較短的函數,不綁定'this'。例如,你可以檢查[mdn](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) – Sridhar

+0

好吧,我明白,ty – ortusolis