【问题标题】:Node JS REST API post request unable to release connectionNode JS REST API 发布请求无法释放连接
【发布时间】:2019-02-24 11:53:43
【问题描述】:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var oracledb = require('oracledb');
const morgan = require('morgan');

app.use(morgan("combined"));

app.use(bodyParser.json());

 app.post("/user", function (req, res){
     console.log("Posting data into table :");
     const connection = oracledb.getConnection(
        {
          user          : "SYSTEM",
          password      : "************",
          connectString : "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DESKTOP-*****)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)))"
        })
        .then(function(conn) {
          return conn.execute(
            `INSERT INTO table1 (department_id, department_name) VALUES` [req.body.department_id, req.body.department_name]
          )
            .then(function(result) {
              console.log(result.rows);
              res.json(result.rows);
              return conn.close();
            })
            .catch(function(err) {
              console.error(err);
              return conn.close();
            });
        })
        .catch(function(err) {
          console.error(err);
        });
    connection.release(
    function (err) {
        if (err) {
            console.error(err.message);
        } else {
            console.log("POST /user_profiles : Connection released");
        }
    });
});
 app.listen(3000, ()=>{
     console.log("Connected . . . ")
 })

上面写的POST程序中无法释放连接,报错如下:

错误:NJS-006:参数 1 的类型无效 在 Object.assert (C:\Node\NodePrograms\node_modules\oracledb\lib\util.js:80:11) 在 Connection.execute (C:\Node\NodePrograms\node_modules\oracledb\lib\connection.js:129:12) 在 C:\Node\NodePrograms\node_modules\oracledb\lib\util.js:116:16 在新的承诺 () 在 Connection.execute (C:\Node\NodePrograms\node_modules\oracledb\lib\util.js:104:14) 在 C:\Node\NodePrograms\postdb.js:20:23

我正在使用 chrome 的 ARC 发布数据。它显示 500 Internal Server Error and <pre>TypeError: connection.release is not a function 我正在使用 Node JS 和 Oracle DB。

【问题讨论】:

标签: node.js rest node-oracledb


【解决方案1】:

这里似乎有两个不同的错误。我们先看connection.release is not a function

oracledb.getConnection 是一个异步函数。如果最后一个参数是回调函数,则返回 undefined;如果最后一个参数不是回调函数,则返回 Promise。无论哪种情况,它都不会直接返回连接。

由于您没有将回调函数作为最后一个参数传入,因此它返回了一个承诺。承诺没有release 方法,因此在调用connection.release 时会出现错误。但是,您已经在另一个代码路径中关闭了与 conn.close 的连接。

至于NJS-006: invalid type for parameter 1 at Object.assert,这与您对conn.execute 的调用有关(如错误堆栈中所示)。这是你所拥有的:

conn.execute(
  `INSERT INTO table1 (department_id, department_name) VALUES` [req.body.department_id, req.body.department_name]
)

请注意,您传递的是要执行的单个值(表达式),而不是您可能想要的两个参数(缺少逗号)。模板文字和数组可能会产生奇怪的值:

console.log(`string` [1]); // "t"
console.log(`string` [{}]); // undefined

您可能会将undefined 传递给conn.execute。这是其中之一“Wat?”时刻。 :) https://www.destroyallsoftware.com/talks/wat

修复该问题后,您还需要更新当前缺少绑定变量的插入语句。请参阅这篇文章(REST API 系列的一部分)以获取一些提示:https://jsao.io/2018/04/creating-a-rest-api-handling-post-put-and-delete-requests/

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2020-06-08
    • 2021-05-29
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2019-05-30
    • 2018-04-06
    相关资源
    最近更新 更多