【问题标题】:Node.js/Express Async functionsNode.js/Express 异步函数
【发布时间】:2016-01-02 22:53:23
【问题描述】:

我正在玩 node.js 和 express。我有一个小服务器,它获取 sqlite 内容并将所有内容发送到 Jade 模板。使用此代码可以正常工作:

var express = require('express');
var app = express();
app.set('view engine', 'jade');
var async = require('async');

var result_title = [];
var result_scope = [];
var result_benefits = [];
var result_technical = [];

app.use(express.static(__dirname + '/views'));

app.get('/product1', function(req, res){

  var sqlite3 = require('sqlite3').verbose();
    var db = new sqlite3.Database('products.db');
    var check;
    db.serialize(function() {
        db.each("SELECT title, scope, body, technical_information FROM products", function(err, row) {
          result_title.push(row.title);

            result_scope.push(row.scope);

            result_benefits.push(row.body);

          result_technical.push(row.technical_information);
        });

    });

  console.log(result_title[0]);

    res.render("index", {title:result_title[0], scope:result_scope[0],benefits:result_benefits[0], technical_information:result_technical[0]});


    db.close();

});

app.listen(8080);

我的问题是,当我转到页面 http://localhost/product1:8080 时,什么都没有显示。需要手动刷新页面才能加载内容!我的研究告诉我,我需要使用异步函数。我编辑了我的代码:

var express = require('express');
var app = express();
app.set('view engine', 'jade');
var async = require('async');

var result_title = [];
var result_scope = [];
var result_benefits = [];
var result_technical = [];

app.use(express.static(__dirname + '/views'));

app.get('/product1', function(req, res){

  var sqlite3 = require('sqlite3').verbose();
    var db = new sqlite3.Database('products.db');
    var check;

  async.series([
    function(callback) {
         db.serialize(function() {
             db.each("SELECT title, scope, body, technical_information FROM products", function(err, row) {
               result_title.push(row.title);

                 result_scope.push(row.scope);

                 result_benefits.push(row.body);

               result_technical.push(row.technical_information);
             });

         });
     },
     function(callback) {
       // console.log(result_title[0]);
          res.render("index", {title:result_title[0], scope:result_scope[0],benefits:result_benefits[0], technical_information:result_technical[0]});

        db.close();
      }
    ], function(error, results) {
      console.log('');
    })
});

app.listen(8030);

但是网页正在加载,正在加载,但没有任何反应.. 我做错了什么,但暂时不知道在哪里。如果有人有想法,那就太好了;-) 谢谢!

【问题讨论】:

    标签: javascript node.js asynchronous express pug


    【解决方案1】:

    您的 url 错误,您的端口的第二个代码块也不同。

    在域或 IP 地址之后给出端口名称,如果不是,请求将转到 /product1:8080 并且您没有任何这样的路由器,因此请求会转到错误页面,这意味着您没有对 404 进行任何错误处理.

    试试:http://localhost:8080/product1http://localhost:8030/product1

    你的第二个代码块也有问题:

    res.render("index", {title:result_title[0], scope:result_scope[0],benefits:result_benefits[0], technical_information:result_technical[0]});
    

    这一行应该在所有系列回调中执行,否则你将无法获得你想要的数据。因为它还在异步函数中。

    ], function(error, results) {
       res.render("index", {title:result_title[0], scope:result_scope[0],benefits:result_benefits[0], technical_information:result_technical[0]});
    })
    

    我刚刚调查了 sqllite3 ,在这种情况下你不需要使用异步库作为额外的(顺便说一句,在异步函数中你必须调用带有返回参数的回调)。 In sqllite3 documentation db.each.

    最新的代码应该可以工作。尝试关注。

    var express = require('express');
    var app = express();
    app.set('view engine', 'jade');
    var async = require('async');
    
    var result_title = [];
    var result_scope = [];
    var result_benefits = [];
    var result_technical = [];
    
    app.use(express.static(__dirname + '/views'));
    
    app.get('/product1', function(req, res){
    
      var sqlite3 = require('sqlite3').verbose();
        var db = new sqlite3.Database('products.db');
        var check;
    
      db.serialize(function() {
         db.each("SELECT title, scope, body, technical_information FROM products", function(err, row) {
           result_title.push(row.title);
    
             result_scope.push(row.scope);
    
             result_benefits.push(row.body);
    
           result_technical.push(row.technical_information);
         },function(err, rows){
            if(err){
                // handle error
            }
            res.render("index", {title:result_title[0], scope:result_scope[0],benefits:result_benefits[0], technical_information:result_technical[0]});
         });
        });
    });
    
    app.listen(8080);
    

    【讨论】:

    • 是的,我知道,但这不是问题,我将代码更新为 8080 和同样的问题。
    • 感谢您的帮助。但是同样的问题:gist.github.com/anonymous/6fe238a282320f9707ea
    • @Silvering,您的代码通常存在异步问题,您必须在异步函数中调用回调函数,但您使用 sqllite3 库在行中循环,我调查它提供了完整的回调函数,所以您将能够在完成每个循环后进行渲染。
    • 非常感谢!!它就像一个魅力!再次感谢!
    • @Silvering ,祝你好运,我还添加了 sqllite3 文档链接。顺便说一句,也看看异步 api 文档,我想你需要下一个阶段,你也可以使用 promises 而不是异步库来防止嵌套代码块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2017-02-04
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多