我一直在努力尝试这一点,尝试使用https://github.com/noffle/latest-tweets npm模块将我最新的推文作为数组发布。但是,无论我用什么方式订购它,都会出现某种形式的错误。主要职位未定义
或未定义推文。
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函数导出到一个帮助器类中,这会导致更多问题。
最佳答案
在编写代码时,应注意变量的范围。 posts
和tweets
变量只能在将其作为参数传递的回调函数中访问,但是您要在它们的作用域之外访问它们。显然,由于参数tweets
是在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});
});
由于许多原因,使用sessions比在编写后端时声明变量更好的选择,这在这里可能无法解释,而且请避免使用嵌套回调。在这种情况下,在为全局变量
res.render
和tweets
赋值之前,可能会调用posts
,这将再次引发错误,表明tweets
和posts
是undefined
。在这种情况下,请使用Javascript的Promises(该语言自己的功能)来处理此类请求。关于javascript - Node.js,“X”未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41535448/