我希望我的 http 回應腳本使用來自我的 SQL 服務器的資料進行回應。所以我可以使用 AJAX 用來自我的 SQL 服務器的資料更新 HTML。我找不到辦法做到這一點。我只是在學習異步,我有一種感覺,如果我可以將異步函式的輸出保存到全域變數,那么它將起作用。任何幫助都可以避免我的頭痛。
我的簡單聽腳本是:
var test = "hello!"
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write(test);
res.end();
}).listen(8080);
我的 sql 代碼是:
const util = require('util');
var mysql = require('mysql');
var con = mysql.createConnection({
host: "XXXXX",
user: "XXXXX",
password: "XXXXX",
database: "XXX"
});
var DBresult=null;
function getdb(){
const query = util.promisify(con.query).bind(con);
(async () => {
try {
const rows = await query('SELECT * FROM mylist');
DBresult=rows;
} finally {
con.end();
}
})()
}
uj5u.com熱心網友回復:
不要對服務器中的異步結果使用任何全域變數或共享的、范圍更大的變數。永遠不要那樣做。這是一種有充分理由的反模式,因為這可能會造成間歇性并發問題,因為您的服務器上可以同時處理多個請求,因此這些會導致對這些變數的訪問沖突,造成間歇性的、非常難以處理的- 除錯問題。我再說一遍,從來沒有。
您沒有描述您嘗試為其撰寫代碼的確切情況,但這里有一個示例。
相反,您在它從異步呼叫到達的背景關系中使用結果。如果您可以使用await,通常會使編碼更清晰。
這是一個簡單的例子:
const con = mysql.createConnection({
host: "XXXXX",
user: "XXXXX",
password: "XXXXX",
database: "XXX"
});
const query = util.promisify(con.query).bind(con);
http.createServer(async function(req, res) {
if (req.path === "/query" && req.method === "GET") {
try {
const rows = await query('SELECT * FROM mylist');
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(rows));
} catch(e) {
console.log(e);
res.statusCode = 500;
res.end();
}
} else {
// some other respone
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write("hello");
res.end();
}
}).listen(8080);
這里需要注意的事項:
- 在處理請求之前檢查路徑和方法。
- 制作回呼函式
async以便它可以使用await. - 確保任何承諾拒絕
await被捕獲try/catch并在出現錯誤時發送錯誤回應。 - 將結果作為 JSON 發送并設定適當的內容型別。
- 您可能正在使用普通
http模塊作為學習經驗,但您很快會發現使用簡單的Express 框架將為您節省大量編程時間并使事情變得更容易。
uj5u.com熱心網友回復:
首先處理異步函式中的錯誤可能是您遇到了一些與資料庫查詢相關的錯誤
const util = require("util");
var mysql = require("mysql");
var con = mysql.createConnection({
host: "XXXXX",
user: "XXXXX",
password: "XXXXX",
database: "XXX",
});
var DBresult = null;
async function getdb() {
try {
const query = util.promisify(con.query).bind(con);
const rows = await query("SELECT * FROM mylist");
DBresult = rows;
} catch (error) {
console.log(error);
} finally {
con.end();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358988.html
標籤:javascript 节点.js 异步 http响应
