当前位置: 首页 > 知识库问答 >
问题:

为什么cookieParser不返回值?

鲜于意
2023-03-14

我在客户端使用vue、vue路由器,在服务器端使用express、morgan(MEVN应用程序)

在客户端我用vue cookie设置cookie

this.$cookies.set('Login', this.login, new Date(Date.now() + 86400 * 5 * 1000))
this.$cookies.set('Password', this.password, new Date(Date.now() + 86400 * 5 * 1000))

在服务器端,我使用CookieParser

所以,在应用程序。我有这样的代码

const express       = require('express');
const morgan        = require('morgan');
const cors          = require('cors');
const bodyParser    = require('body-parser');
const cookieParser  = require('cookie-parser');

const config        = require('./config/config');
const db            = require('./controllers/DB');
const mCLogs        = require('./modelControllers/Logs');
const mCLogin       = require('./modelControllers/Login');

const app = express();
app.use(morgan('combined'));
app.use(bodyParser.json());
app.use(cors());
app.use(cookieParser()); /*cookie parser*/

并且,在文件./ModelController/Login中,我有这样一个GET请求的代码

    exports.checkLoginSession = async (req, res, next) => {
/*its not all of the code*/
        var loginHash = req.cookies['Login'];
        console.log(loginHash)
        if(loginHash == undefined) {
            res.send({
                logged: false,
                description: "err mes"
            });
        } else {
            res.send({
                logged: true,
                description: "mes"
            });
        }
    }

问题是,var loginHash=req.cookies['Login'];总是返回未定义的,即使我有登录cookie

添加:我如何调用此方法

客户端和使用axios

mounted () {
    this.getLoginData()
  },
  methods: {
    async getLoginData () {
      const response = await LoginHandler.checkUserLoginSession()
      if (response.data.logged === true) {
        this.$router.push('/')
      } else {
        this.errorMessage = response.data.description
      }
    }
}

罗金汉德勒。js(客户端)

从@/service/api导入api

export default {
  checkUserLoginSession () {
    return api().get('/login')
  }
}

app.js中的服务器端 /login链接

app.get('/login', mCLogin.checkLoginSession);
app.post('/login', mCLogin.checkUserData);

补充:

当我使用axios API这样的代码时,它不起作用:

从@/service/api导入api

export default {
  checkUserLoginSession () {
    return api().get('/login')
  }
}

所以,当我调用app.get('/login')返回cookie值未定义,但是,如果我在浏览器中打开链接(服务器端)localhost:3000/login它返回正确的值

添加:checkUserData

exports.checkUserData = async (req, res) => {
    try {
        let login = req.body.login;
        let password = req.body.password;

        const user = await db.users.findOne({
            where: {
                Login: login,
                Password: password
            }
        });
        if(user == null)
        {
            res.send({
                logged: false,
                description: "Пользователь не найден."
            });
            return;
        }
        if(user.dataValues.Login == login && user.dataValues.Password == password)
        {
            res.send({
                logged: true,
                description: "Авторизация произошла успешно. Сейчас Вас перенаправит!"
            });
            return;
        }
    }
    catch(ex) {
        res.send({
            logged: false,
            description: "Произошла ошибка на стороне сервера."
        });
        console.log(ex);
        return;
    }

如果我向axios添加带有凭据的:true。创建,服务器返回cookie值,但我在控制台行中发现了此错误

Access to XMLHttpRequest at 'http://localhost:3000/login' from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

共有1个答案

郭易安
2023-03-14

好了,伙计们,我解决了我的问题。

所以,答案是。

  1. 更改LoginHandler代码:

来自:

import api from '@/services/api'

export default {
  checkUserLoginSession () {
    return api().get('/login')
  }
}

致:

import api from '@/services/api'

export default {
  checkUserLoginSession () {
    return api().get('/login', {withCredentials: true})
  }
}

来自:

app.use(cors());

到:

app.use(cors({ credentials: true, origin: "http://localhost:8080" }));

致:

exports.checkLoginSession = (req, res, next) => {
    const { Login, Password } = req.cookies;
    //Where Login, Password ... is your cookie name
    //console.log(Login)
    if(Login == undefined) {
        res.send({
            logged: false,
            description: "Нет сохранённых хешей для авторизации!"
        });
    } else {
        res.send({
            logged: true,
            description: "Авторизован."
        });
    }
}

附言:感谢所有试图帮助我的人

 类似资料:
  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 问题内容: 我正在通过以下方式从Java代码启动Windows进程(用C ++编写,但没有源代码): 我的问题是,waitFor()方法永远不会结束。因此,我尝试在一个简单的shell中启动该过程,并以shell中的许多打印正确结束(我猜是标准输出)。 因此,即使我现在不需要这些输出,我还是决定创建并启动一个读取标准输出的线程。这解决了问题。 因此,我的问题是以下问题:该解决方案是“启动并等待具有

  • 当我试图对泛型类型执行TypedQuery时,我会从Eclipse得到一个未检查的类型转换警告。 我在这里使用泛型,因为在数据集中,由于查询和编辑的时间限制,每年都必须分离到不同的表中。表中有118年的数据(自1900年以来),我希望构建一个可以使用Java Reflections API每年扩展自己的系统。但是,这意味着在编译之前,我的父类不知道它们将对哪个子类或表进行操作。 下面是一些代码的示

  • 问题内容: 以下是ajax请求。 这就是delete.php 运行代码后,它将成功删除文件,但不会显示任何消息。 我也尝试将ajax请求更改为: 仍然不显示该消息。所以我想在delete.php文件中出了点问题。请帮忙。 问题答案: 进行jquery + ajax + php的最佳方法如下: jQuery的: PHP:

  • 问题内容: 我正在编写一个PHP脚本,用于通过Linux shell命令使用PHP调用它来检查网络连接: 我没有从ping获得错误消息的输出,这是我期望的: 如果该域是一个很好的域,例如yahoo.com,则将ping中的输出输出到数组中。但是,如果这是一个错误,例如它不会返回到数组。 为什么会发生这种情况,有更好的方法吗? 问题答案: 您应该将stderr重定向到stdout。 为此,请像这样更

  • 为什么会 返回False,但是 不返回True,而是返回对象在内存中的位置。我找不到一种方法让这句话变为真,但我知道这是真的,因为: 返回"Yes!"。 正如我所说,这没有实际意义,至少目前没有,但它确实让我感到困惑。