我想通过提交提交按钮直接在邮递员中打印用户响应。
以上是我的代码
import express from "express";
import {dirname} from 'path';
import {fileURLToPath} from "url";
import bodyParser from "body-parser";
import fs from "fs";
const __dirname=dirname(fileURLToPath(import.meta.url));
const app = express();
app.use(bodyParser.urlencoded({extended:true}));
app.get("/", (req, res) => {
res.sendFile(__dirname+"/public/index.html");
});
app.post("/submit",(req,res)=>{
console.log(req.body);
const { email, name,password } = req.body;
fs.appendFile("file.txt",`${email},${name},${password}\n`,(err)=>{
if (err) throw err;
console.log("file saved success");
res.redirect("/");
});
});
app.listen(3000, () => {
console.log(" port running on 3000");
});
我尝试了chatgpt给出的许多解决方案,但都不起作用
Express Side
:Multer 是用于处理多部分/表单数据的中间件,通常用于上传文件。它允许 Express 解析包含文件的 POST 请求中发送的表单数据。 cors 与 CORS 中间件一起可以处理多部分/表单数据请求并管理跨源资源共享 (CORS) 策略。 HTML POST 调用不会有问题。
FormData
:当从客户端提交带有 enctype multipart/form-data 的表单时,它会以 FormData 对象的形式发送数据。这种格式也允许发送文件和非文本数据,例如 JSON。
Response POST by JSON
:尽管表单数据以 multipart/form-data 格式发送,但 Express 仍然可以使用 JSON 进行响应。使用 Multer 处理表单数据后,Express 可以将 JSON 数据发送回客户端,通常包含有关请求成功或失败的信息。
Middleware Integration
:Multer 通过 app.use(multer().none()) 集成到 Express 中间件堆栈中。此设置允许 Express 解析 POST 请求中发送的表单数据,并使其在 req.body 对象中可访问。
JSON Response
:处理完表单数据后,Express 可以使用 res.json() 发送 JSON 响应。此响应可以包含任何相关数据,例如成功消息、错误详细信息或已处理的表单数据,然后客户端 JavaScript 可以相应地处理这些数据。
HTML 端
JSON Display
:JavaScript 代码从服务器获取 JSON 数据并将其以可读格式显示在 HTML 页面上。
Form Data
用于 POST 调用:HTML 表单收集用户输入(电子邮件、用户名、密码),JavaScript 将其作为 HTTP POST 请求中的 JSON 发送到服务器。
Response Handling
:JavaScript 等待并接收来自服务器的 JSON 响应,然后将其显示在 HTML 页面上。
此代码可以工作。
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>User Registry</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
#container {
width: 400px;
background-color: #f7f7f7;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.form-group {
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 5px;
}
input {
width: 100%;
padding: 8px;
border-radius: 5px;
border: 1px solid #ccc;
}
button {
width: 100%;
padding: 10px 0;
border-radius: 5px;
border: none;
background-color: #007bff;
color: #fff;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
pre {
background-color: #f0f0f0;
padding: 20px;
border-radius: 8px;
overflow-x: auto;
}
</style>
</head>
<body>
<div id="container">
<form id="userForm">
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="emailInput" name="email" value="[email protected]" required>
</div>
<div class="form-group">
<label for="username">Username:</label>
<input type="text" id="nameInput" name="username" value="tom_cruise" required>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="passwordInput" name="password" value="1234" required>
</div>
<button type="button" id="button">Register</button>
</form>
<pre id="meaning"></pre>
</div>
<script>
const button = document.querySelector("#button");
const meaning = document.querySelector("#meaning");
button.addEventListener("click", async () => {
const email = document.querySelector("#emailInput").value;
const username = document.querySelector("#nameInput").value;
const password = document.querySelector("#passwordInput").value;
const url = `http://localhost:3000/register`;
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ email, username, password })
});
const data = await response.json();
displayMeanings(data);
} catch (error) {
meaning.innerHTML = `<p>Error fetching data: ${error.message}</p>`;
}
});
function displayMeanings(data) {
meaning.textContent = JSON.stringify(data, null, 2);
}
</script>
</body>
</html>
server.js
const express = require('express');
const bodyParser = require('body-parser');
const multer = require('multer');
const cors = require('cors'); // Import cors module
const fs = require('fs');
const app = express();
const port = 3000;
function readUsersFromFile() {
try {
const data = fs.readFileSync('users_log.json', 'utf8');
return JSON.parse(data);
} catch (err) {
return [];
}
}
function writeUsersToFile(users) {
fs.writeFileSync('users_log.json', JSON.stringify(users, null, 2), 'utf8');
}
const upload = multer();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
// Enable CORS for all routes
app.use(cors());
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
// POST route for registering users
app.post('/register', upload.none(), (req, res) => {
const { email, username, password } = req.body;
// You can perform validation here
const newUser = { email, username, password };
let users = readUsersFromFile();
users.push(newUser);
writeUsersToFile(users);
// Send JSON response for the newly registered user
res.json({
success: true,
message: 'User registered successfully',
user: newUser
});
});
app.listen(port, () => {
console.log(`Server is listening at http://localhost:${port}`);
});
npm install express body-parser multer cors
node server.js
打开浏览器并输入用户的凭据,然后按按钮
http://localhost:3000/
在 users_log.json 中
[
{
"email": "[email protected]",
"username": "tom_cruise",
"password": "1234"
},
{
"email": "michael [email protected]",
"username": "michael_jackson",
"password": "1234"
}
]