代码拉取完成,页面将自动刷新
const exp = require('express'),
bodyParser = require('body-parser'),
cookieParser = require('cookie-parser'),
fs = require('fs'),
multer = require('multer'),
app = exp()
app.use(exp.static('www'))
app.use(bodyParser.urlencoded({ extended: true }))
app.use(cookieParser())
const storage = multer.diskStorage({
destination: 'www/uploads',
filename: function (req, file, callback) {
var petname = req.cookies.petname
callback(null, `${petname}.jpg`)
}
}),
uploads = multer({ storage })
/*--------------------登录--------------------*/
app.post('/api/user/signin', (req, res) => {
var fileName = `users/${req.body.petname}.txt`
function send(code, message) {
res.status(200).json({ code, message })
}
fs.exists(fileName, exists => {
if (exists) {
fs.readFile(fileName, (err, data) => {
if (err) {
send('file error', '抱歉,系统错误...')
}
else {
var user = JSON.parse(data)
if (user.password == req.body.password) {
res.cookie('petname', req.body.petname)
// 此处需要加密
send('success', '登录成功...')
}
else {
send('signin error', '用户名或密码错误!')
}
}
})
}
else {
send('register error', '用户名未注册!')
}
})
})
/*--------------------退出--------------------*/
app.get('/api/user/signout', (req, res) => {
res.clearCookie('petname')
res.status(200).json({ code: 'success' })
})
/*--------------------提问--------------------*/
app.post('/ask', (req, res) => {
var petname = req.cookies.petname
function send(code, message) {
res.status(200).json({ code, message })
}
if (!petname) {
send('signin error', '请重新登录...')
return
}
var time = new Date()
req.body.petname = petname
req.body.ip = req.ip
req.body.time = time
function saveFile() {
var fileName = `questions/${time.getTime()}.txt`
fs.appendFile(fileName, JSON.stringify(req.body), err => {
if (err) {
send('file error', '抱歉,系统错误...')
}
else {
send('success', '问题提交成功!')
}
})
}
fs.exists('questions', exists => {
if (exists) {
saveFile()
}
else {
fs.mkdir('questions', err => {
if (err) {
send('file error', '抱歉,系统错误...')
}
else {
saveFile()
}
})
}
})
})
/*--------------------回答--------------------*/
app.post('/answer/:id', (req, res) => {
var petname = req.cookies.petname
function send(code, message) {
res.status(200).json({ code, message })
}
if (!petname) {
send('signin error', '请重新登录...')
return
}
console.log(req.body)
var filename = `questions/${req.params.id}.txt`
req.body.petname = petname
req.body.ip = req.ip
req.body.time = new Date()
fs.readFile(filename, (err, data) => {
if (err) {
send('file error', '抱歉,系统错误...')
}
else {
var question = JSON.parse(data)
// 第1次回答时,问题里没有answers这个数组,所以添加
// 以后的每一次直接向answers里push
if (!question.answers) question.answers = []
question.answers.push(req.body)
// 经过上一句的代码,文件里既有问题又有答案
fs.writeFile(filename, JSON.stringify(question), err => {
if (err) {
send('file error', '抱歉,系统错误...')
}
else {
send('success', '回答提交成功!')
}
})
}
})
})
/*--------------------头像--------------------*/
app.post('/user/photo', uploads.single('photo'), (req, res) => {
res.status(200).json({ code: 'success', message: '上传成功' })
})
/*--------------------首页--------------------*/
app.get('/index', (req, res) => {
function send(code, message, data) {
res.status(200).json({ code, message, data })
}
function readFiles(i, files, questions, complete) {
// 第1次传参:0,['123.txt','234.txt'], [], ()
if (i < files.length) {
// 在if分支里调用fs里的readFile读取文件内容
fs.readFile(`questions/${files[i]}`, (err, data) => {
if (!err) {
// 读完第1个文件内容后,questions是以下的形式
// [{...}]
// 读完第2个文件内容后,questions是以下的形式
// [{...},{...}]
questions.push(JSON.parse(data))
}
// 递归调用(自身调用自身)
readFiles(++i, files, questions, complete)
})
}
// 直到读完最后一个文件内容会执行else分支
else {
// 读完后的回调函数
// 作用是把读取的所有内容返回到浏览器端
complete()
}
}
// readdir:读取目录下的所有文件(注意:不是读文件内容)
// 读取的结果是所有文件名组成的数组
// 例如:['zhangsan.txt','lisi.txt']
fs.readdir('questions', (err, files) => {
if (err) {
send('file error', '抱歉,系统错误...')
}
else {
console.log(files)
// reverse():反转数组
// 目的:把最新的问题和答案显示在最上面
files = files.reverse()
var questions = []
// readFiles:自定义函数
readFiles(0, files, questions, () => {
send('success', '读取数据成功!', questions)
})
}
})
})
app.listen(3000, () => console.log('正在运行...'))
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。