Nodejs jade模板后台传的Object变量,另一个请求取出来是自动转成Array
Nodejs jade模板后台传的Object变量,另一个请求取出来是自动转成Array
比如在 post 请求里
req.flash(“data”,{bj:100,sh:200});
get请求里 取得 data
var data= req.flash(“data”); [ { bj: 100, sh: 200 } ]
如果再传到模板用 res.render(‘page’, {data:JSON.stringify(data[0]));
用 var data= !{data} 这样取 空值的话最后解析出来 是var data=
有值的话提示 SyntaxError: missing ] after element list var data= [object Object] 如果用 if (!{data}) { var data=!{data}; } 空值解析出来是 if() 会报语法错误
如果是传列表 res.render(‘page’, {data:JSON.stringify(data)); 就可以 只不过页面里是一个列表,每次再用下标选一下 没法直接传object 只能从object -> list -> object
Node.js Jade模板后台传的Object变量, 另一个请求取出来是自动转成Array
问题描述
在使用Node.js时,我们经常需要在不同的请求之间传递数据。例如,在一个POST请求中,我们将一个对象(Object)存入req.flash
,但在GET请求中取出时,这个对象却变成了数组(Array)。这会导致一些问题,特别是在将数据传递给Jade模板时。
示例代码
假设我们在一个POST请求中存储了一个对象:
app.post('/post', function(req, res) {
req.flash('data', {bj: 100, sh: 200});
res.redirect('/get');
});
而在GET请求中取出数据时:
app.get('/get', function(req, res) {
var data = req.flash('data'); // 这里data变成了[[Object]]
res.render('page', {data: JSON.stringify(data[0])});
});
在Jade模板中使用这些数据时:
script.
var data = !{data};
console.log(data);
解决方案
为了解决这个问题,我们可以先将对象转换为字符串,然后再在客户端进行解析。这样可以避免类型转换带来的问题。
- 服务器端:将对象转换为字符串后传递给模板。
app.get('/get', function(req, res) {
var data = req.flash('data'); // 这里data变成了[[Object]]
res.render('page', {data: JSON.stringify(data[0])});
});
- 客户端:在Jade模板中使用JavaScript来解析字符串。
script.
var data = !{data};
try {
data = JSON.parse(data);
console.log(data); // 输出 {bj: 100, sh: 200}
} catch (e) {
console.error("Failed to parse data", e);
}
解释
JSON.stringify(data[0])
将对象转换为JSON字符串。- 在Jade模板中,
!{data}
直接输出了字符串。 - 使用
JSON.parse(data)
在客户端将字符串解析回对象。
通过这种方式,我们可以确保数据在不同请求之间正确传递,并且可以在模板中正确地使用这些数据。
根据你的描述,问题主要出现在如何正确地将一个对象传递给Jade模板并确保其能够被正确渲染。问题的核心在于req.flash()
返回的是一个数组,即使这个数组只有一个元素。为了正确处理这个问题,我们可以采取以下几种方式:
解决方案
方法1:直接在服务器端处理数据
在服务器端,我们可以先解构或获取对象本身,然后再将其传递给模板。
// 假设你已经有一个Express应用
app.post('/some-route', function(req, res) {
req.flash("data", {bj: 100, sh: 200});
res.redirect('/another-route');
});
app.get('/another-route', function(req, res) {
let data = req.flash('data');
// 如果你知道data数组只有一个元素,可以直接解构
let { bj, sh } = data[0] || {};
res.render('page', { bj, sh });
});
在Jade模板中:
if bj && sh
p Beijing: #{bj}, Shanghai: #{sh}
else
p No data available.
方法2:使用JSON.stringify()在服务器端处理
如果你确实需要通过JSON.stringify()
来处理数据,可以这样做:
app.get('/another-route', function(req, res) {
let data = req.flash('data');
res.render('page', { jsonData: JSON.stringify(data[0]) });
});
在Jade模板中:
script.
var data = !{jsonData};
if (data)
console.log(data.bj); // 访问bj属性
这种方法避免了直接在模板中使用复杂的逻辑,并且保证了传递的数据格式一致。
总结
主要问题在于req.flash()
返回的是数组,即便这个数组仅包含一个对象。为了解决这个问题,你可以选择在服务器端直接处理数据(如解构或使用JSON),或者通过字符串化后再在客户端解析。这样可以避免模板中的复杂逻辑,并确保数据能正确渲染。