#node.js #forms #express #handlebars.js
#node.js #формы #выразить #handlebars.js
Вопрос:
Я новичок с node.js и руль. Не уверен, что здесь делать. Я передаю данные в handlebars из своего кода для отображения «учетная запись / регистрация». Таким образом, «заголовок» работает, как и ожидалось, для вкладки страницы, а «ошибка» — нет. Кажется, все это сработает или ничего из этого не получится. Я подтвердил с помощью debug, что ошибка имеет значение на серверной части, но {{error}}
в нижней части формы не отображается. Это всего лишь простая строка, которую я подтвердил, «требуется имя пользователя». Я пытался избежать этого {{error}}
и тройных усов {{{error}}}
, все равно ничего. Подумал, может быть, это отсутствующая зависимость, но заголовок передается. Я также пытался передавать данные как error,
, error: test,
, и даже пытался {{#each}}
в форме. Никакой радости.
Что я делаю не так?
const { request } = require('express');
const express = require('express');
const config = require('config');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const moment = require('moment');
const db = require('../db');
const authMiddleware = require('../middleware/auth');
const debug = require('debug')('app:routes:account');
// creating instance of router.
const router = express.Router();
router.use(express.urlencoded({ extended: false }));
router.use(express.json());
router.post('/register', async (req, res, next) => {
try {
const username = req.body.username;
const email = req.body.email;
const password = req.body.password;
const password_confirm = req.body.password_confirm;
debug(`username = ${username}`);
debug(`email = ${email}`);
debug(`password = ${password}`);
debug(`passwordConfirm = ${password_confirm}`);
// let user = null;
let error = null;
if (!username) {
error = 'username is required';
}
if (error) {
res.render('account/register', {
title: 'Errors!',
error: error,
username: username,
});
debug(`error = ${error}`);
}
} catch (err) {
next(err);
}
});
module.exports = router;
И вот форма:
<form id="register" method="POST" class="form needs-validation mt-3" novalidate>
<div class="my-3 font-weight-bold text-center">Register Account</div>
<div class="form-group">Please complete the following form to create an account on our website.</div>
<div class="form-group">
<label for="username">Username</label>
<input id="username" name="username" class="form-control" type="text" value="{{username}}" required>
<div class="invalid-feedback">Please enter a unique username.</div>
</div>
<div class="form-group">
<label for="email">Email</label>
<input id="email" name="email" class="form-control" type="email" value="{{email}}" required>
<div class="invalid-feedback">Please enter a valid address.</div>
</div>
<div class="form-group">
<label for="password">Password {{error}} </label>
<input id="password" name="password" class="form-control" type="password" value="{{password}}" required>
<div class="invalid-feedback"> Please enter your password.</div>
</div>
<div class="form-group">
<label for="password_confirm">Confirm Password</label>
<input id="password_confirm" name="password_confirm" class="form-control" type="password" value="{{password}}" required>
<div class="invalid-feedback"> Please confirm passwords.</div>
</div>
<div class="form-group"><button class="btn btn-primary"><i class="far fa-save"></i>Login</button></div>
<div class="form-group"><output class="text-danger"> {{error}} </output></div>
</form>
Комментарии:
1. Оригинальный плакат здесь, имя пользователя также не передается. Просто заголовок страницы.
2. можете ли вы поделиться своей структурой проекта?
3. Привет, нишкауш, я не уверен, как я могу поделиться структурой проекта. Вы имеете в виду, что находится в моем проводнике?
4. Да, я чувствую, что проблема в том, как handlebars подключен к вашему основному файлу обработки маршрута. Можете ли вы попробовать создать другой файл шаблона HTML и попробовать передать ему некоторые случайные реквизиты, просто чтобы проверить, действительно ли это проблема с подключением..
5. Я попытался вставить его в свой main.handlebars, чтобы посмотреть, появится ли он. Не повезло. Я попытался изменить заголовок страницы на сообщение об ошибке, и это сработало, но ничего не могу получить в теле.
Ответ №1:
Я поиграл с этим и, наконец, заставил его работать, я изложил свое решение ниже. Это достаточно очевидно, глядя на это сейчас. Тем не менее, я работаю с чужим кодом, которому не нужно было делать то, что я сделал здесь. Может кто-нибудь объяснить, почему мой исходный код мог не сработать?
router.post('/register', async (req, res, next) => {
try {
const username = req.body.username;
const email = req.body.email;
const password = req.body.password;
const password_confirm = req.body.password_confirm;
const data = {
error: null,
};
if (!username) {
data.error = 'username is required';
res.render('account/register', {title: 'Errors!', data });
}
} catch (err) {
next(err);
}
});
И затем вот как я получил это для отображения в форме.
<output class="text-danger">{{data.error}}</output>