2

我没有从我的文件中要求方法来./db/index.jsserver.js数据库中选择数据并显示它。

/db/index.js是这样的:

'use strict';

const pgp = require('pg-promise')();
const pg = pgp(process.env.DATABASE_URL);

let select = () => {
    pg.any('SELECT username, status FROM status')
        .then(function(data){
            for (var item of data) {
                return item.username + "'s status is " + item.status;
            }
        })
        .catch(function(err) {
            return 'Error: ' + err.message || err;
        });
};

module.exports = () => {
    select
};

我想从另一个文件中调用它:

'use strict';

const port = process.env.PORT || 3000;
const bodyParser = require('body-parser');
const express = require('express');
const app = express();
const db = require('./db/');

app.use(bodyParser.urlencoded({extended: true}));

app.post('/logdash', function(req, res, next) {
    res.status(200).send(db.select());
});

app.listen(port, function() {
    console.log('Server is running on port', port);
});

我正在使用 Heroku,就像这样,查看日志,终端和 Slack 都没有显示错误(这是一个斜杠命令)。我找不到有关如何正确分离功能的帮助。如何select从不同的文件中调用此方法和任何其他方法?

4

3 回答 3

2

您的代码中有很多问题,其中一些在@jfriend00 的上一个答案中列出。

我只会补充一点,当方法成功时,您也不会从该方法返回任何数据。

考虑到你有多少错误,而不是重新迭代它们,我会给你一个更正的代码示例。

数据库模块:

'use strict';

const pgp = require('pg-promise')();
const db = pgp(process.env.DATABASE_URL);

let select = (req, res, next) =>
    db.map('SELECT username, status FROM status', null, row=> {
        return row.username + "'s status is " + row.status;
    })
        .then(data=> {
            res.status(200).send(data);
        })
        .catch(err=> {
            res.status(500).send(err.message || err);
        });

module.exports = {
    select
};

以及 HTTP 服务文件:

'use strict';

const port = process.env.PORT || 3000;
const bodyParser = require('body-parser');
const express = require('express');
const app = express();
const db = require('./db/');

app.use(bodyParser.urlencoded({extended: true}));

app.post('/logdash', db.select);

app.listen(port, function () {
    console.log('Server is running on port', port);
});

该代码基于pg-promise v.4.3.x(升级,如果您有旧版本)。

我不会说这是组织代码的好方法,但至少它是一个工作示例。您可以查看pg-promise-demo以获得完整的应用程序示例,它可以让您更好地了解如何组织数据库代码。


API 参考:地图


于 2016-05-26T01:50:48.290 回答
1

模块中的代码是异步的。您不能直接返回值。相反,您应该返回承诺,然后使用来自调用者的承诺来获取最终的异步值。

有关此一般概念的进一步讨论,请参阅此答案:

如何从异步调用返回响应?

将您的代码更改为此(请参阅嵌入式注释):

'use strict';

const pgp = require('pg-promise')();
const pg = pgp(process.env.DATABASE_URL);

let select = () => {
    // return the promise here
    return pg.any('SELECT username, status FROM status')
        .then(function(data){
            return data.map(function(item) {
                return item.username + "'s status is " + item.status;
            });
        })
        .catch(function(err) {
            // to keep this an error, we have to rethrow the error, otherwise
            // the rejection is considered "handled" and is not an error
            throw 'Error: ' + err.message || err;
        });
};

// export the function
module.exports.select = select;

并这样称呼它:

'use strict';

const port = process.env.PORT || 3000;
const bodyParser = require('body-parser');
const express = require('express');
const app = express();
const db = require('./db/');

app.use(bodyParser.urlencoded({extended: true}));

app.post('/logdash', function(req, res, next) {
    db.select().then(function(data) {
        res.status(200).json(data);
    }).catch(function(err) {
        // add some sort of error response here
        res.status(500).json(err);
    });
});

app.listen(port, function() {
    console.log('Server is running on port', port);
});

此处的更改摘要:

  1. select(),返回承诺
  2. .catch()in 中select(),重新抛出错误以使其成为被拒绝的承诺。如果您为 a 添加处理程序.catch()并且不重新抛出或返回被拒绝的承诺,则错误将被处理并且承诺被解决。
  3. 你需要修复你的for循环。它不应该在for没有条件检查的情况下在循环内进行返回。该代码可能只是错误的(尽管我不确定您打算做什么)。
  4. 调用时db.select(),使用.then()处理程序获取最终解析值。
  5. db.select()为promise添加错误处理程序。
  6. 更改导出,这db.select()就是您的功能。
  7. 修改了您在for循环中引用数据的方式,因此它实际上会获取所需的属性。
于 2016-05-26T00:36:14.217 回答
0

一些东西。我会确保你的select函数返回一个 Promise。我也会处理你路线中的承诺。这样您就可以正确发送适当的状态代码和响应。

db/index.js

'use strict';

const pgp = require('pg-promise')();
const pg = pgp(process.env.DATABASE_URL);

let select = () => {
  return pg.any('SELECT username, status FROM status')
}

module.exports = () => {
    select
};

server.js

'use strict';

const port = process.env.PORT || 3000;
const bodyParser = require('body-parser');
const express = require('express');
const app = express();
const db = require('./db/');

app.use(bodyParser.urlencoded({extended: true}));

app.post('/logdash', function(req, res, next) {
    db.select()
        .then((data) => {
          res.status(200).json(data)
        })
        .catch((error) => {
          res.status(500).json(error)
        })
});

app.listen(port, function() {
    console.log('Server is running on port', port);
});

我没有对此进行测试,但它应该可以解决问题。

于 2016-05-26T02:29:16.223 回答