質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%

解決済

Express Sessionに入れた値がundefinedになってしまう

kazu235
kazu235

総合スコア17

1回答

0評価

0クリップ

205閲覧

投稿2022/06/11 05:51

実現したいこと

React Nativeでスマホアプリを開発しています。
バックエンドでNode.jsを使用してWebAPIを作っていて、Express SessionでSession管理をしたいです。

発生している問題

postでreq.sessionに値を保存しても、getで呼び出したときにundefinedになってしまいます。
どうしたらいいでしょうか?

app.js(Node.js)

javascript

const express = require('express'); const app = express(); const session = require('express-session'); // const bodyParser = require('body-parser'); app.use(express.json()); // app.use(express.urlencoded({ extended: false })); app.use(session({ secret: 'my_secret_key', resave: false, saveUninitialized: false, rolling: true, cookie: { httpOnly: true, maxAge: 60 * 1000 } })); //routes app.use('/api/user', require('./routes/user')); app.use('/api/tmp_user', require('./routes/tmp_user')); app.use('/api/post', require('./routes/post')); app.use('/api/hand_history', require('./routes/hand_history')); app.use('/validation', require('./routes/validation')); app.use('/login', require('./routes/login')); app.listen(3000);

login.js(Node.js)

javascript

const express = require('express'); const router = express.Router(); const connection = require('../connetction'); const bcrypt = require('bcrypt'); router.get('/', (req, res, next) => { console.log(req.session); }) router.post('/', (req, res) => { const email = req.body.email; const plain = req.body.password; connection.query( 'select * from users where email = ?', [email], (error, results) => { if (results.length > 0) { const hash = results[0].password; bcrypt.compare(plain, hash, (error, isEqual) => { if (isEqual) { req.session.userId = results[0].id; console.log(req.session) console.log('ログイン成功') } else { console.log('ログイン失敗') } }) } } ) }) module.exports = router;

Login.js(React Native)

javascript

import { StatusBar } from 'expo-status-bar'; import { useState, Component } from 'react'; import { Platform, StyleSheet, Text, View, Button, TextInput, TouchableOpacity, Alert } from 'react-native'; import axios from 'axios'; const host = 'http://192.168.0.195:3000' const Login = () => { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [message, setMessage] = useState([]); const login = async () => { await axios.post(host + '/login', { email: email, password: password, } ) .then(() => { }) .catch((error) => console.log(error)); } const test = async () => { await axios.get(host + '/login'); } return ( <View style={styles.container}> <Text>メールアドレス</Text> <TextInput style={styles.input} placeholder='mail' onChangeText={(text) => setEmail(text)} /> <Text>パスワード</Text> <TextInput style={styles.input} secureTextEntry={true} placeholder='password' onChangeText={(text) => setPassword(text)} /> <Button title='ログイン' onPress={() => { login(); }} /> <Button title='test' onPress={() => { test(); }} /> {message.map((index) => { return ( <Text>{index.message}</Text> ) })} <StatusBar style="auto" /> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center', }, input: { borderWidth: 1, width: 150 }, }); export default Login;

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る