【问题标题】:Rendering a template/view in client side javascript在客户端 javascript 中呈现模板/视图
【发布时间】:2020-06-22 04:31:57
【问题描述】:

我是节点新手并制作了一个简单的登录页面 - 客户端 javascript 从输入中获取值,然后向具有包含所有用户帐户的数据库的服务器发出发布请求。在服务器中检查此信息: - 如果详细信息正确,他们应该被带到一个新页面,其中包含(他们的用户名)中的动态内容 - 如果详细信息不正确,则主页不应更改 - 我只想添加一个元素,说“密码错误,重试”

当我直接从表单发出发布请求时效果很好,但决定更改它以便我可以在登录页面上显示“密码错误,重试”。

我的客户端 javascript

"use strict"
    
document.querySelector("button").addEventListener("click",submit)
    async function submit(e){
        e.preventDefault();
        let username=document.querySelector("#username").value
        let password=document.querySelector("#password").value
       
        let options = {
            headers:{
                "Content-Type" : "application/json"
            },
            method: "POST",
            body: JSON.stringify({username,password})
        }
        
        let response = await fetch("/api",options)
        let responseData = await response.json()
    
        if(responseData.status == "fail"){
            console.log("show the fail message");
            
        }
    }

我的服务器端 js:

"use strict"

//Installing express
let express = require(`express`)
let app = express()
app.use(express.json())
var bodyParser = require('body-parser')
var urlencodedParser = bodyParser.urlencoded({ extended: false })
let ejs = require('ejs');

app.set("view engine","ejs")
//running the server
app.listen(3000,()=>{
    console.log("server is running boi");
})
//Middleware to load the static content
app.use(express.static('public'))

//Database stuff 
let Datastore = require('nedb')
let db = new Datastore({ filename: 'database.db' });
db.loadDatabase()



//Handler for any post requests made from the form
app.post('/api', urlencodedParser, function (req, res) {
    let user = req.body.username
    
    
    //querying the db
    db.find({username:user},(err,docs)=>{
        if(docs[0]){
            if(docs[0].password == req.body.password){
                console.log("You have logged in!");
                res.send({status:"success"})
            }else{
                console.log("incorrect password")
                res.send({status:"fail"})

            }
        }else{
            console.log("incorrect username");
            res.send({status:"fail"})
        }
        
    })
})

如果用户传递了详细信息并且详细信息是正确的,那么我希望使用他们的名称呈现一个模板(我使用 EJS),我如何从客户端执行此操作,如果我不能,可以做什么有吗?

【问题讨论】:

  • 您的问题/问题是什么?你得到了什么错误?
  • @Shihab 如果用户通过并且详细信息正确,我希望使用其名称呈现模板(我使用 ejs),我如何从客户端执行此操作,如果我不能,我该怎么办?
  • 我正在写一个答案,因为我无法在此处放置代码。

标签: javascript html node.js ejs


【解决方案1】:

正如我所见,您正在使用 EJS,但没有渲染任何内容。相反,您正在向客户端发送 JSON 响应。现在,您可以从您的客户端执行此操作:

客户端代码:

let responseData = await response.json()
    
  if(responseData.status == "fail"){
      alert('Failed to login');
      // You can do DOM manipulation here. Like: show a message to user
  } else {
    // Login success. Do something here
    alert('Login success')
  }

更新:使用 EJS

app.post('/api', urlencodedParser, function (req, res) {
    let user = req.body.username;
    db.find({username:user},(err,docs)=>{
      if(docs[0]) {
        res.render('template', {user: docs[0]})
      } else {
        res.render('template', {user: null})
      }
    })
}

在您的 EJS 中:

<% if (user === null) { %>
    <h1>Login failed</h1>
  <% } else { %>
    <h1>Login success</h1>
<% } %>

【讨论】:

  • 感谢您的回复,但我有点困惑。我也在哪里指导他们?我的模板是一个 ejs 文件。此外,如果我从客户端 javascript 发出另一个发布请求,为什么我无法在我的示例中呈现它时能够呈现它
  • 但是,您没有在 /api 路由中使用 EJS。要使用 EJS,您必须创建一个 EJS 模板。然后,您必须使用res.render('TEMPLATE_NAME') 方法呈现该模板。
  • 啊抱歉我应该说 - 我最初的想法是如果它是成功登录,即密码匹配 - 我会使用 res.render("template file") 但这不起作用,我会假设是因为提取是在我的客户端数据@Shihab
  • 是的,完全正确。你需要在服务端做 EJS 相关的代码。客户端不存在 EJS。
  • 但是你的解决方案不就是使用ejs来渲染页面吗?你说//做某事的部分是我不确定的部分 - 我试图将用户发送到包含他们的用户名的模板
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2020-01-14
  • 2011-11-03
  • 2014-04-22
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多