【问题标题】:How to write rest api for the node js tedious?如何为node js 写rest api 很繁琐?
【发布时间】:2022-02-14 00:34:33
【问题描述】:

我无法在 express API 中获取 sql 数据?它不断加载并获得一个空白屏幕,但在控制台中获得了 sql 数据响应。

我的 index.js 代码:

var Connection = require("tedious").Connection;
var Request = require("tedious").Request;
var Types = require("tedious").Types;
const express = require("express");
const app = express();
const port = 3001;
var cors = require("cors");

app.get("/", function(req, res) {
    var config = {
        server:
            "***",
        authentication: {
            type: "default",
            options: {
                userName: "****",
                password: "****",
            },
        },
        options: {
            encrypt: true,
            database: "****",
        },
    };
    
    const connection = new Connection(config);
    
    connection.on("connect", (err, result) => {
        if (err) {
            console.log("Connection Failed");
            throw err;
        }
        executeStatement();
    });
    
    connection.connect();
    
    function executeStatement() {
        const request = new Request(
            "SELECT * FROM Platform",
            (err, rowCount, rows) => {
                if (err) {
                    console.log(err);
                }
            }
        );
        
        request.on("row", (columns) => {
            columns.forEach((column, rowCount, response) => {
                if (column.value === null) {
                    console.log("NULL");
                } else {
                    console.log(column.metadata.colName + " = " + column.value);
                }
                
                return res.send(response);
            });
        });
        
        connection.execSql(request);
    }
});

app.use(cors());

app.listen(port, function(err) {
    if (err) console.log("Error in server setup");
    console.log("Server listening on Port", port);
});

收到错误为“ERR_HTTP_HEADERS_SENT”

events.js:352

throw er; // Unhandled 'error' event
^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:561:11)
at ServerResponse.header (C:\Users\fashila.barveen\Desktop\CMS_EXT_TOOL\server\cms_tool_backend\node_modules\express\lib\response.js:776:10)
at ServerResponse.json (C:\Users\fashila.barveen\Desktop\CMS_EXT_TOOL\server\cms_tool_backend\node_modules\express\lib\response.js:264:10)
at ServerResponse.send (C:\Users\fashila.barveen\Desktop\CMS_EXT_TOOL\server\cms_tool_backend\node_modules\express\lib\response.js:158:21)
at C:\Users\fashila.barveen\Desktop\CMS_EXT_TOOL\server\cms_tool_backend\index.js:94:20
at Array.forEach (<anonymous>)
at Request.<anonymous> (C:\Users\fashila.barveen\Desktop\CMS_EXT_TOOL\server\cms_tool_backend\index.js:88:15)
at Request.emit (events.js:375:28)
at Request.emit (C:\Users\fashila.barveen\Desktop\CMS_EXT_TOOL\server\cms_tool_backend\node_modules\tedious\lib\request.js:150:18)
at Parser.<anonymous> (C:\Users\fashila.barveen\Desktop\CMS_EXT_TOOL\server\cms_tool_backend\node_modules\tedious\lib\connection.js:1322:21)
Emitted 'error' event on Readable instance at:
at emitErrorNT (internal/streams/destroy.js:106:8)
at emitErrorCloseNT (internal/streams/destroy.js:74:3)
at processTicksAndRejections (internal/process/task_queues.js:82:21) {
    code: 'ERR_HTTP_HEADERS_SENT'
}

请帮忙解决这个错误。

【问题讨论】:

  • return res.send(response); 在您的 forEach() 中,因此它被多次调用导致该错误。
  • @Brettski 你能帮我解决这个错误必须返回 api 响应吗?控制台元素应该在 api 响应中。

标签: javascript node.js express npm


【解决方案1】:

我无法验证这一点。您收到该错误的原因是您多次尝试send requestjs 请求。你有它在你Array.forEach()循环。看来您需要做的就是将return res.send(response); 移到循环之外。

下面的res.send() 是在调用数据库之后移动的。我假设 connection.execSql(request); 返回一个 Promise 在您发送 Expressjs 结果之前需要解决它。希望这将提供所需的一般方法。

var Connection = require("tedious").Connection;
var Request = require("tedious").Request;
var Types = require("tedious").Types;
const express = require("express");
const app = express();
const port = 3001;
var cors = require("cors");

app.get("/", function(req, res) {
    var config = {
        server:
            "***",
        authentication: {
            type: "default",
            options: {
                userName: "****",
                password: "****",
            },
        },
        options: {
            encrypt: true,
            database: "****",
        },
    };
    
    const connection = new Connection(config);
    
    connection.on("connect", (err, result) => {
        if (err) {
            console.log("Connection Failed");
            throw err;
        }
        executeStatement();
    });
    
    connection.connect();
    
    function executeStatement() {
        const request = new Request(
            "SELECT * FROM Platform",
            (err, rowCount, rows) => {
                if (err) {
                    console.log(err);
                }
            }
        );

   
        let outputData = ''; // Added to collect the data in the `Array.forEach()`

        request.on("row", (columns) => {
            columns.forEach((column, rowCount, response) => {
                if (column.value === null) {
                    console.log("NULL");
                } else {
                    console.log(column.metadata.colName + " = " + column.value);
                }
                
                outputData += response;
            });
        });
        
        connection.execSql(request); // This probably returns a promise which will need to resolved before you return the data.

        return res.send(outputData);
    }
});

app.use(cors());

app.listen(port, function(err) {
    if (err) console.log("Error in server setup");
    console.log("Server listening on Port", port);
});

【讨论】:

  • 感谢@Brettski,这段代码仍然只返回在创建新变量时定义的值并在request.on之后返回它,所以这里的输出数据为null。
  • 我并没有真正关注。我只是想告诉你你的错误来自哪里。如果这个答案没有任何价值,我会删除它,因为它对社区没有任何好处。
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多