为什么不是';t express&x27;在PUT方法内调用s res.render?

为什么不是';t express&x27;在PUT方法内调用s res.render?,express,fetch,ejs,render,put,Express,Fetch,Ejs,Render,Put,我有一个带有ejs视图引擎的express应用程序。 在ejs模板中,我有一个带有onClick事件的按钮,用于触发获取请求: <button class="remove-btn" onclick="removeGroceryItem('<%= index %>')" >Remove</button> express应用程序路由处理程序: /* PUT grocery list*/ app.put('/', func

我有一个带有ejs视图引擎的express应用程序。 在ejs模板中,我有一个带有onClick事件的按钮,用于触发获取请求:

<button class="remove-btn" onclick="removeGroceryItem('<%= index %>')" >Remove</button> 
express应用程序路由处理程序:

/* PUT grocery list*/
app.put('/', function(req, res, next) {
  groceryItemsContainer.splice(Number.parseInt(req.body.groceryItem), 1)
  res.render('index', { 
    title: 'Express Grocery List App',
    notification: 'removed',
    groceryList: groceryItemsContainer
  })
  res.end();
})

接收到PUT请求时的状态为200。但是res.render似乎没有被触发——这是为什么???

从您的评论中可以看出,您希望浏览器中显示
res.render()
的结果。这不是在浏览器Javascript中使用
fetch()
的Ajax调用所做的。它只会将内容返回到Javascript中。它不会在浏览器中显示任何内容


因此,您的
res.render()
内容会返回到您网页中的Javascript,而您网页中Javascript中的
console.log(value)
实际上应该在控制台中显示
res.render()
中的内容。如果希望该内容显示在浏览器中,则需要使用自己的Javascript将该内容插入当前浏览器DOM中。

为什么不调用
res.render()
?在
fetch()?您是否在
res.render()
前后放置了
console.log()
,以查看它们是否显示输出?您是否意识到像
fetch()
这样的Ajax调用只为您的Javascript获取数据-它本身不会更改浏览器页面。此外,在调用
res.render()
之后调用
res.end()
是错误的
res.render()
已经自己调用了
res.end()
。因此,请删除
res.end()
。正如@jfriend00所指出的,在
res.render()
有机会执行它需要执行的操作之前,您调用
res.end()
。从控制台中,我看到有一个PUT请求,但没有GET请求来获取样式和Javascript。所以我怀疑res.render是否已经运行。这是有道理的。因此,如果我想让ejs使用新变量重新呈现模板,我应该怎么做?@EddieLam-如果它与您只需要一个新的更新副本的页面URL完全相同,您可以让浏览器Javascript使用
window.location.reload()刷新页面
这将导致浏览器再次从服务器请求URL,您可以在服务器上重新呈现URL。或者,您可以将新添加的内容作为Ajax调用的结果发送回来,并让Javascript将新内容插入当前页面,以生成与刷新相同的结果。在这两种情况下,都无法像现在这样将完全呈现的页面发送回Javascript。
/* PUT grocery list*/
app.put('/', function(req, res, next) {
  groceryItemsContainer.splice(Number.parseInt(req.body.groceryItem), 1)
  res.render('index', { 
    title: 'Express Grocery List App',
    notification: 'removed',
    groceryList: groceryItemsContainer
  })
  res.end();
})