Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MEVN堆栈在启动后重定向到主页_Node.js_Express_Vue.js_Redirect_Vuejs2 - Fatal编程技术网

Node.js MEVN堆栈在启动后重定向到主页

Node.js MEVN堆栈在启动后重定向到主页,node.js,express,vue.js,redirect,vuejs2,Node.js,Express,Vue.js,Redirect,Vuejs2,我目前正在创建网站的注册功能。 我正在使用MEVN堆栈,我已经设法让我的前端与我的数据库一起工作,但一旦完成了,我就得到了一个 无法发布用户/注册 让我向您展示相关代码: router.post('/signup', (req, res, next) => { //Verify if user email is associated with an account. User.find({email: req.body.email}) .exec() .then(u

我目前正在创建网站的注册功能。 我正在使用MEVN堆栈,我已经设法让我的前端与我的数据库一起工作,但一旦完成了,我就得到了一个

无法发布用户/注册

让我向您展示相关代码:

router.post('/signup', (req, res, next) => {
  //Verify if user email is associated with an account.
  User.find({email: req.body.email})
    .exec()
    .then(user => {
      //Returns message if user email is associated with an account.
      if(user.length >= 1) {
        getCode.fourHundred(res, 409, 
          'This email is already associated with an account.');
      } else { //If email is not found, makes a hashed password value. 
        if(req.body.password !== 'undefined') {
          bcrypt.hash(req.body.password, 10, (err, hash) => {
            if(err) {
              getCode.fiveHundred(res, err);
            } else {
              //If no errors occur, creates a new user. 
              const user = new User({
                _id: new mongoose.Types.ObjectId(),
                firstName: req.body.firstName,
                lastName: req.body.lastName,
                email: req.body.email,
                password: hash
              });
              // Saves user information to Database. 
              user.save()
              .then(result => {
                console.log(result);
                getCode.twoHundred(res, 201, 'User created')
                return res.redirect(301, 'localhost:8080')
              })
              .catch(getCode.fiveHundred(res, err))
            }
          });
        } 
      }
    });
});

我的前端如下:

<template>
  <main class="container">
    <h1> Sign Up</h1>
    <form class="grid-container" action="/users/signup" method="POST">
      <label class="label" for="first-name">First Name:</label>
      <input
        id="first-name"
        type="text"
        class="first-name input form-control"
        placeholder="First Name"
        v-model="firstName"
        required>

      <label class="label" for="last-name" >Last Name:</label>
      <input id="last-name"
         type="text"
         class="last-name input form-control"
         placeholder="Last Name"
         v-model="lastName"
         required>
      <label class="label" for="email" >Email:</label>
      <input id="email"
         type="email"
         class="email input form-control"
         placeholder="example@example.com"
         v-model="email"
         required>
      <label class="label" for="password">Password:</label>
      <input id="password"
         type="password"
         class="password input form-control"
         placeholder="Password"
         v-model="password"
         required>
      <div class="button-grid">
        <button
          class="button"
          type="submit"
          @click="signUp">
            Sign Up
        </button>
      </div>

    </form>
  </main>
</template>

<script>
import AuthenticationService from '@/services/AuthenticationService.js'

export default {
  name: 'SignUp',
  data () {
    return {
      firstName: '',
      lastName: '',
      email: '',
      password: ''
    }
  },
  methods: {
    async signUp () {
      const response = await AuthenticationService.signUp({
        firstName: this.firstName,
        lastName: this.lastName,
        email: this.email,
        password: this.password
      })
      console.log(response)
      setTimeout(() => this.redirect(), 1000)
    },
    redirect () {
      this.$router.push({ name: 'BuyAndSell' })
    }
  }
}
</script>

我试着通过Vue重定向,也试着通过express重定向,但我什么都没得到

编辑:我还添加了这段代码,因为我重构了一些函数来清理代码

const getFiveHundredErrors = (res, err) => {
    console.log(err);
    return res.status(500).json({
      error: err
    });
  };

  const getfourHundredErrors = (res, code, message) => {
    return res.status(code).json({
      message: message
    })
  };

  const getTwoHundredSuccessCodes = (res, code, output, token) => {
    return res.status(code).json({
      output: output,
      token: token || null
    })

  }

  module.exports = { 
    fiveHundred: getFiveHundredErrors, 
    fourHundred: getfourHundredErrors, 
    twoHundred: getTwoHundredSuccessCodes }
这是app.js文件。 我在控制台中遇到一个500错误,可能是.catch()中的错误,可能是错误所在?但我不知道如何让代码在创建用户后重定向回主页。而且,即使创建了用户,200状态也没有显示给我

const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');
const path = require('path');

const app = express();
const port = process.env.PORT || 3000;

const userRoutes = require('./api/routes/users');
const productRoutes = require('./api/routes/products');
const savedItemsRoutes = require('./api/routes/savedItems');

//I removed the mongodb.connect function to avoid exposing that info, even though I have the password stored in a .env file. 

//Middleware.
app.use(morgan('dev'))
app.use('/uploads', express.static('uploads'))
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(cors());

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 
  'Origin, X-Requested-Width, Content-Type, Accept, Authorization'
  );
  if(req.method === 'OPTIONS') {
    res.header('Access-Control-Allow-Methods', 
    'PUT', 'POST', 'PATCH', 'DELETE', 'GET');
    return res.status(200/json({}));
  }
  next();
});

// Request Handling Routes. 
app.use('/users', userRoutes);
app.use('/products', productRoutes);
app.use('/savedItems', savedItemsRoutes);

其他问题: 我有点理解这里发生了什么,但我不确定我能在哪里解决它。我知道一旦发送了原始响应,我就必须返回一些res.status,但是我只是有点困惑于我的代码流是什么,我正试图跟踪错误消息带我去的地方,但我在这一点上一无所知

(node:28036) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:535:11)
    at ServerResponse.header (/Users/edgarnegron/Projects/llevatelopr/server/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/Users/edgarnegron/Projects/llevatelopr/server/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/Users/edgarnegron/Projects/llevatelopr/server/node_modules/express/lib/response.js:267:15)
    at getTwoHundredSuccessCodes (/Users/edgarnegron/Projects/llevatelopr/server/api/routes/users.js:112:20)
    at /Users/edgarnegron/Projects/llevatelopr/server/api/routes/users.js:40:17
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

问题是表单操作将您从SPA发送到错误的路径。实际上,您在表单提交中做了两件事:

1) 单击操作调用一个
signUp
方法。这是在创建用户,尽管我们看不到服务代码

2) 形式动作

这是一个糟糕的设计,原因有二。你不应该像这样产生两个单独的调用,也不应该这样使用表单操作,否则你将离开你的单页应用程序。还有前端和后端重定向。完全删除表单操作/方法。这就是将您从SPA带到错误路线(显示错误消息)的原因。一般来说,你不会将表单操作与SPA一起使用,因为它会让你脱离应用程序

问题2 将post保存代码更改为:

user.save()
  .then(result => {
    return res.status(201).send(result);
  })

这将设置状态并发回刚刚创建的用户,只要
save
也返回它。不需要301。

问题是表单操作将您从SPA发送到错误的路径。实际上,您在表单提交中做了两件事:

1) 单击操作调用一个
signUp
方法。这是在创建用户,尽管我们看不到服务代码

2) 形式动作

这是一个糟糕的设计,原因有二。你不应该像这样产生两个单独的调用,也不应该这样使用表单操作,否则你将离开你的单页应用程序。还有前端和后端重定向。完全删除表单操作/方法。这就是将您从SPA带到错误路线(显示错误消息)的原因。一般来说,你不会将表单操作与SPA一起使用,因为它会让你脱离应用程序

问题2 将post保存代码更改为:

user.save()
  .then(result => {
    return res.status(201).send(result);
  })

这将设置状态并发回刚刚创建的用户,只要
save
也返回它。不需要301。

此代码与错误无关。您能说明在Express中您在哪里处理
用户/注册
路线吗?
app.post形式的东西('users/signup',…
此消息基本上表示不存在此类路由处理程序。@dan是的,我理解你的意思。但是,每当我在数据库中创建用户时,以及当我转到mongoose时,我都能看到控制台日志。我不确定在这之后如何重定向到我的主页。@dan我已经发布了整件事,但一个格式错误没有显示出来,我现在修复了它。谢谢你花时间回答我的问题。你是说你创建了一个用户,即使Express说它找不到路由,还是你以其他方式创建了用户?你也应该显示任何
/users
路由。@dan^^显然是因为你的帮助而修复了它。在y之前你写了这条消息,我想这是我根据你的建议必须做的。非常感谢你,我已经尝试解决这个问题将近一周了。你是一个活生生的储蓄者。这段代码与错误无关。你能告诉我你在Express中处理
用户/注册
路线的位置吗?某种形式的
app.post('users/signup',…
此消息基本上表示不存在此类路由处理程序。@dan是的,我理解你的意思。但是,每当我在数据库中创建用户时,以及当我转到mongoose时,我都能看到控制台日志。我不确定在这之后如何重定向到我的主页。@dan我已经发布了整件事,但一个格式错误没有显示出来,我现在修复了它。谢谢你花时间回答我的问题。你是说你创建了一个用户,即使Express说它找不到路由,还是你以其他方式创建了用户?你也应该显示任何
/users
路由。@dan^^显然是因为你的帮助而修复了它。在y之前你写了这条消息,我想这就是我必须按照你的建议去做的。非常感谢你,我已经尝试解决这个问题将近一个星期了。你是一个活生生的储蓄者。
user.save()
  .then(result => {
    return res.status(201).send(result);
  })