使用Node.js从其他文件调用方法

时间:2016-05-26 00:15:53

标签: javascript node.js heroku pg-promise

我没有要求我的s.my_movieclip.addEventListener("click", fl_MouseClickHandler.bind(s)); function fl_MouseClickHandler() { console.log('I want banana!'); } 中的方法进入我的./db/index.js文件来从数据库中选择数据并显示它。

server.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
};

我正在使用Heroku,并且像这样,看着日志,终端和Slack都没有显示错误(它是一个斜杠命令)。我无法找到如何正确分离功能的帮助。如何从不同的文件中调用此'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); }); 方法和任何其他方法?

3 个答案:

答案 0 :(得分:1)

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

有关这个一般概念的进一步讨论,请参阅以下答案:

How do I return the response from an asynchronous call?

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

'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() select()中,重新抛出错误以使其成为被拒绝的承诺。如果为.catch()添加处理程序并且不重新抛出或返回被拒绝的承诺,则会处理错误并解析承诺。
  3. 您需要修复for循环。它不应该在for循环内进行返回而不进行条件检查。那段代码可能是错的(虽然我不确定你打算做什么)。
  4. 当您致电db.select()时,请使用.then()处理程序获取最终解决的值。
  5. db.select()承诺添加错误处理程序。
  6. 更改导出,以便db.select()是您的功能。
  7. 修改了for循环中引用数据的方式,以便实际获取所需的属性。

答案 1 :(得分:1)

您的代码中存在许多问题,其中一些问题已在@ 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参考:map

答案 2 :(得分: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);
});

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