繁体   English   中英

Node.js,“ X”未定义

[英]Node.js, 'X' is not defined

我一直在努力尝试这一点,尝试通过https://github.com/noffle/latest-tweets npm模块将最新的tweet作为数组发布。 但是,无论我用什么方式订购它,都会出现某种形式的错误。 主要是帖子未定义或推文未定义。

 var express = require('express'); var latestTweets = require('latest-tweets') var Post = require('../models/blog'); var router = express.Router(); router.get('/', function (req, res) { Post.getPosts((err, posts) => { if(err){ throw err; } }); latestTweets('my_twitter_id', function (err, tweets) { console.log(tweets) }) res.render('index', {tweets : tweets, posts : posts}); }); 

我还尝试将LatestTweets函数导出到一个帮助器类中,这会导致更多问题。

帖子和推文都是回调中的变量。 您不能在回调之外使用它们。

快速解决:

router.get('/', function (req, res) {
    Post.getPosts((err, posts) => {
        if(err){ throw err; }

        latestTweets('my_twitter_id', function (err_, tweets) {
            if(err_){ throw err_; }
            console.log(tweets);

            res.render('index', {tweets : tweets, posts : posts});
        });
    });
});

现在,如果您正在寻找一个更漂亮的解决方案,那么可以看看异步模块。 异步回购

在编写代码时,应注意变量的范围 poststweets变量只能在将其作为参数传递的回调函数中访问,但是您要在它们的作用域之外访问它们。 显然,由于参数tweets是在latestTweets的回调内latestTweets ,因此变量tweets的局部作用域仅限于该回调。 因此,当程序到达res.render ,它将尝试评估tweetsposts ,但无法识别它们,并返回not defined

function myFunc(){
    var x = 0;
}
console.log(x);

上面的函数将返回x is not defined的相同错误,因为外部代码不知道x是什么。 它在函数myFunc是本地的,并且只能在函数内部访问。 为了使它可访问,您将必须使其全局,即在主代码中声明var x = 0
在您的代码中,您能做的最好的事情就是在router.get函数的回调中声明两个变量(即,全局回调),并将它们分配给各自回调中的poststweets

router.get('/', function (req, res) {
var tweets, posts;
Post.getPosts((err, posts) => {
    if(err){
        throw err;
    }
    posts = posts;
});
latestTweets('my_twitter_id', function (err, tweets) {
console.log(tweets)
tweets = tweets;
})
res.render('index', {tweets : tweets, posts : posts});

});

由于很多原因,使用会话比在编写后端时声明变量更好。

另外 ,请避免使用嵌套的回调。 在这种情况下,可能在全局变量tweetsposts被分配一个值之前调用res.render ,这将再次引发错误,表示tweetspostsundefined 在这种情况下,请使用Javascript的Promises (该语言本身的功能)来处理此类请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM