[英]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});
});
});
});
现在,如果您正在寻找一个更漂亮的解决方案,那么可以看看异步模块。 异步回购
在编写代码时,应注意变量的范围 。 posts
和tweets
变量只能在将其作为参数传递的回调函数中访问,但是您要在它们的作用域之外访问它们。 显然,由于参数tweets
是在latestTweets
的回调内latestTweets
,因此变量tweets
的局部作用域仅限于该回调。 因此,当程序到达res.render
,它将尝试评估tweets
和posts
,但无法识别它们,并返回not defined
。
例
function myFunc(){
var x = 0;
}
console.log(x);
上面的函数将返回x is not defined
的相同错误,因为外部代码不知道x
是什么。 它在函数myFunc
是本地的,并且只能在函数内部访问。 为了使它可访问,您将必须使其全局,即在主代码中声明var x = 0
。
在您的代码中,您能做的最好的事情就是在router.get
函数的回调中声明两个变量(即,全局回调),并将它们分配给各自回调中的posts
和tweets
。
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});
});
由于很多原因,使用会话比在编写后端时声明变量更好。
另外 ,请避免使用嵌套的回调。 在这种情况下,可能在全局变量tweets
和posts
被分配一个值之前调用res.render
,这将再次引发错误,表示tweets
和posts
是undefined
。 在这种情况下,请使用Javascript的Promises (该语言本身的功能)来处理此类请求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.