【问题标题】:NodeJs Database LookupNodeJs 数据库查找
【发布时间】:2016-10-06 18:31:08
【问题描述】:

我在 node 中使用 express 和 postgresql 中的网络网站 - 使用 pg npm 模块 - 作为我的数据库。 我现在正在尝试设置这样的用户页面:

...

app.get('/u/:u/', function (req, res) {
    pool.connect(function(err, client, done) {
        ...

        client.query('SELECT * FROM users WHERE id =($1)', [req.params.u], function(err, result) {
            ... done(); ...
        });
    });
});

...

req.params.u 在 DB 查询中返回 undefined。

我认为这是因为回调函数与应用程序路由不在同一范围内,我该如何检查这样的数据库?

我觉得有更好的方法来做到这一点。

【问题讨论】:

  • 具体来说,您想检查/测试数据库的具体内容是什么?
  • ... 'SELECT * FROM users WHERE id =($1)', [req.params.u] ...
  • 请更具体。究竟是什么问题以及您遇到的问题?
  • req.params.u 在函数中未定义,我正在搜索用户名...
  • @Tobiq 。确定检查用户的存在,真的吗?但是你想用这些信息做什么。在某处返回它?分配给一个 var ?用全局/作用域发射器发射它?

标签: node.js postgresql rest api express


【解决方案1】:

因此,如果问题是 params 未定义,则解决方案应该来自类似于:

...

app.get('/u/:u/', function (req, res) {
    var tempReq = req
    pool.connect(function(err, client, done) {
    ...

    client.query('SELECT * FROM users WHERE id =($1)',[tempReq.params.u], function(err, result) {
        ... done(); ...
    });
  });
});

...

【讨论】:

  • 如果 rempReq 可以访问,为什么 req 不能访问?它被丢弃了吗?
  • 我想因为 req 是应用程序“this”的一部分。我不是 Express Guru(实际上我使用 Koa),但这是我在我的变量“神奇地”消失时第一次尝试的解决方案
  • client.query 的回调中的变量仍未定义。
【解决方案2】:

确保将body-parser 代码放在routes 的所有app.js 文件中以获得req.body or req.params or req.query

var app=express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: false
}));

您的 req 对象在您的整个路由范围内可用,然后您可以在此块中的任何位置使用它,无需存储在局部变量中

app.get('/u/:u/', function (req, res) {
    pool.connect(function(err, client, done) {
    ...

    client.query('SELECT * FROM users WHERE id =($1)',[req.params.u], function(err, result) {
        ... done(); ...
    });
  });
});

【讨论】:

  • 我没有使用任何中间件,除了快速静态文件夹配置,作为请求的最后手段,所以使用静态文件。
  • 你是如何获得 req.params 值的?
  • 原生表达,还有tempReq.params.u从哪里来,从来没有定义过。
  • 你能告诉我你从哪里请求这条路线吗?
  • 这是第一个路由,不需要任何中间件。
【解决方案3】:

您也可以一次与多个数据库通信

你首先需要 ssl..

var fs = require('fs');
var SSLkey = fs.readFileSync('/local/pem/location/key.pem');
var SSLcert = fs.readFileSync('/local/pem/location/cert.pem');

现在是数据库代码

const mysql = require('mysql');

const forumdb_db = mysql.createConnection({
    host: 'localhost',
    user: 'dbuser',
    password: 'dbpassword',
    database: 'dbname',
    key: SSLkey,
    cert: SSLcert,
    connectionLimit: 15,
    queueLimit: 30,
    acquireTimeout: 1000
});

const inventory_db = mysql.createConnection({
    host: 'localhost',
    user: 'dbuser',
    password: 'dbpassword',
    database: 'dbname',
    key: SSLkey,
    cert: SSLcert,
    connectionLimit: 15,
    queueLimit: 30,
    acquireTimeout: 1000
});

连接到数据库

inventory_db.connect((err0) => {
    inventory_db.query("SELECT `bubblebum` FROM `user_inventory` WHERE `index`='1' LIMIT 1;", function(err0, result0, field0) {
        console.log(result0[0].bubblebum);
    });
});

forum_db.connect((err0) => {
    forum_db.query("SELECT `stars` FROM `user_inventory` WHERE `stars`>'100' LIMIT 1;", function(err1, result1, field1) {
        console.log(result1[0].stars);
    });
});

这里有一个问题,你会在一段时间不活动后断开连接,所以你应该设置一个间隔,每十秒向 sql server 发送一个快速请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2023-03-15
    • 2013-01-05
    • 1970-01-01
    • 2016-05-06
    • 2022-01-22
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多