작성
·
452
0
안녕하세요. passport local 로그인 실습을 하다가 막히는 부분이 있어 질문드립니다.
현재 postman으로 실험 시 회원가입은 정상적으로 진행이 되는 것 같은데, postman으로 로그인 시도 시 다음과 같은 오류코드가 발생합니다.
Error: Invalid value <ref *1> IncomingMessage {
_readableState: ReadableState {
objectMode: false,
highWaterMark: 16384,
buffer: BufferList { head: null, tail: null, length: 0 },
length: 0,
pipes: [],
flowing: true,
ended: true,
endEmitted: true,
reading: false,
sync: false,
needReadable: false,
emittedReadable: false,
readableListening: false,
resumeScheduled: false,
errorEmitted: false,
emitClose: true,
autoDestroy: false,
destroyed: false,
errored: null,
closed: false,
closeEmitted: false,
defaultEncoding: 'utf8',
awaitDrainWriters: null,
multiAwaitDrain: false,
readingMore: false,
decoder: null,
encoding: null,
[Symbol(kPaused)]: false
},
_events: [Object: null prototype] { end: [Function: clearRequestTimeout] },
_eventsCount: 1,
_maxListeners: undefined,
socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 8,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: true,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: [HTTPParser],
on: [Function: socketListenerWrap],
addListener: [Function: socketListenerWrap],
prependListener: [Function: socketListenerWrap],
_paused: false,
_httpMessage: [ServerResponse],
_peername: [Object],
[Symbol(async_id_symbol)]: 78,
[Symbol(kHandle)]: [TCP],
[Symbol(kSetNoDelay)]: false,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(RequestTimeout)]: undefined
},
httpVersionMajor: 1,
httpVersionMinor: 1,
httpVersion: '1.1',
complete: true,
headers: {
'content-type': 'application/json',
'user-agent': 'PostmanRuntime/7.29.0',
accept: '*/*',
'postman-token': '667cd00d-55cb-434f-80ee-6800fe7e4d60',
host: 'localhost:3000',
'accept-encoding': 'gzip, deflate, br',
connection: 'keep-alive',
'content-length': '76',
cookie: 'connect.sid=s%3Atv5OOUthLZaPN8ZQChSAm4qaJB0CZbgU.MrtvXtMcWOoYkXGY0dY4H%2F6tGs25VsY8vJoRPQvx%2FMI'
},
rawHeaders: [
'Content-Type',
'application/json',
'User-Agent',
'PostmanRuntime/7.29.0',
'Accept',
'*/*',
'Postman-Token',
'667cd00d-55cb-434f-80ee-6800fe7e4d60',
'Host',
'localhost:3000',
'Accept-Encoding',
'gzip, deflate, br',
'Connection',
'keep-alive',
'Content-Length',
'76',
'Cookie',
'connect.sid=s%3Atv5OOUthLZaPN8ZQChSAm4qaJB0CZbgU.MrtvXtMcWOoYkXGY0dY4H%2F6tGs25VsY8vJoRPQvx%2FMI'
],
trailers: {},
rawTrailers: [],
aborted: false,
upgrade: false,
url: '/login',
method: 'POST',
statusCode: null,
statusMessage: null,
client: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 8,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: true,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: [HTTPParser],
on: [Function: socketListenerWrap],
addListener: [Function: socketListenerWrap],
prependListener: [Function: socketListenerWrap],
_paused: false,
_httpMessage: [ServerResponse],
_peername: [Object],
[Symbol(async_id_symbol)]: 78,
[Symbol(kHandle)]: [TCP],
[Symbol(kSetNoDelay)]: false,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(RequestTimeout)]: undefined
},
_consuming: true,
_dumped: false,
next: [Function: next],
baseUrl: '/auth',
originalUrl: '/auth/login',
_parsedUrl: Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: '/login',
path: '/login',
href: '/login',
_raw: '/login'
},
params: {},
query: {},
res: ServerResponse {
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
outputData: [],
outputSize: 0,
writable: true,
destroyed: false,
_last: false,
chunkedEncoding: false,
shouldKeepAlive: true,
_defaultKeepAlive: true,
useChunkedEncodingByDefault: true,
sendDate: true,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
_contentLength: null,
_hasBody: true,
_trailer: '',
finished: false,
_headerSent: false,
socket: [Socket],
_header: null,
_keepAliveTimeout: 5000,
_onPendingData: [Function: bound updateOutgoingData],
_sent100: false,
_expect_continue: false,
req: [Circular *1],
locals: [Object: null prototype] {},
_startAt: undefined,
_startTime: undefined,
writeHead: [Function: writeHead],
__onFinished: [Function],
end: [Function: end],
[Symbol(kCapture)]: false,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kOutHeaders)]: [Object: null prototype]
},
_startAt: [ 779390, 642704127 ],
_startTime: 2022-02-06T14:57:51.132Z,
_remoteAddress: '::1',
body: { email: 's2s2ss@naver.com', name: 'ddd', password: '12343' },
_body: true,
length: undefined,
secret: 'nodepracticesecret',
cookies: {},
signedCookies: [Object: null prototype] {
'connect.sid': 'tv5OOUthLZaPN8ZQChSAm4qaJB0CZbgU'
},
_parsedOriginalUrl: Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: '/auth/login',
path: '/auth/login',
href: '/auth/login',
_raw: '/auth/login'
},
sessionStore: MemoryStore {
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
sessions: [Object: null prototype] {},
generate: [Function (anonymous)],
[Symbol(kCapture)]: false
},
sessionID: '8oW9NcDPX2SJzfB5KT6guRURg59uUftq',
session: Session { cookie: [Object] },
flash: [Function: _flash],
_passport: { instance: [Authenticator] },
logIn: [Function (anonymous)],
login: [Function (anonymous)],
logOut: [Function (anonymous)],
logout: [Function (anonymous)],
isAuthenticated: [Function (anonymous)],
isUnauthenticated: [Function (anonymous)],
_sessionManager: SessionManager {
_key: 'passport',
_serializeUser: [Function: bound ]
},
route: Route { path: '/login', stack: [Array], methods: [Object] },
[Symbol(kCapture)]: false,
[Symbol(RequestTimeout)]: undefined
}
at Object.escape (/Users/macintosh/Desktop/node_practice/node_practice/node_modules/sequelize/dist/lib/sql-string.js:52:11)
at MySQLQueryGenerator.escape (/Users/macintosh/Desktop/node_practice/node_practice/node_modules/sequelize/dist/lib/dialects/abstract/query-generator.js:709:22)
at MySQLQueryGenerator.whereItemQuery (/Users/macintosh/Desktop/node_practice/node_practice/node_modules/sequelize/dist/lib/dialects/abstract/query-generator.js:1733:102)
at /Users/macintosh/Desktop/node_practice/node_practice/node_modules/sequelize/dist/lib/dialects/abstract/query-generator.js:1646:25
at Array.forEach (<anonymous>)
at MySQLQueryGenerator.whereItemsQuery (/Users/macintosh/Desktop/node_practice/node_practice/node_modules/sequelize/dist/lib/dialects/abstract/query-generator.js:1644:35)
at /Users/macintosh/Desktop/node_practice/node_practice/node_modules/sequelize/dist/lib/dialects/abstract/query-generator.js:1752:30
at Array.map (<anonymous>)
at MySQLQueryGenerator._whereGroupBind (/Users/macintosh/Desktop/node_practice/node_practice/node_modules/sequelize/dist/lib/dialects/abstract/query-generator.js:1751:21)
at MySQLQueryGenerator.whereItemQuery (/Users/macintosh/Desktop/node_practice/node_practice/node_modules/sequelize/dist/lib/dialects/abstract/query-generator.js:1702:19)
(node:8940) UnhandledPromiseRejectionWarning: TypeError: done is not a function
at Strategy._verify (/Users/macintosh/Desktop/node_practice/node_practice/passport/localStrategy.js:30:13)
(Use `node —trace-warnings …` to show where the warning was created)
(node:8940) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `—unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:8940) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
PromiseRejectionWarning 부분이 async await 에러 핸들링을 안 해줘서 생긴다고 하는데, 교재에 나와있는대로 localstrategy부분의 에러 핸들링 부분은 교재와 비슷하게 적은 것 같은데...왜 오류가 나는지 잘 모르겠습니다ㅠㅠ
//localStrategy.js
const passport = require('passport');
const localStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
const { user } = require('../models');
module.exports = () => {
passport.use(new localStrategy({
passReqToCallback : true,
usernameField:'email',
passwordField:'password',
},
async (email, password, done) => {
try{
const exUser = await user.findOne({where:{email}});
if (exUser) {
const result = await user.findOne({where:{password}});
// const result = await bcrypt.compare(password, exUser.password);
if(result){
done(null, exUser);
} else {
done(null, false, {message:'비밀번호가 불일치'});
}
} else {
done(null, false, {message:'가입되지 않은 회원입니다'});
}
} catch (err) {
console.error(err);
done(err);
}
}
));
};
위의 코드는 passport/localStrategy.js 파일이며,
아래 코드는 routes/auth.js 파일입니다.
const express = require('express');
const passport = require('passport');
const bcrypt = require('bcrypt');
const { isLoggedIn, isNotLoggedIn } = require('./middlewares');
const { user } = require('../models');
const router = express.Router();
//회원가입 라우터
router.post('/join', isNotLoggedIn, async (req,res,next) => {
const { email, name, password } = req.body;
try {
const exUser = await user.findOne({where:{ email }});
if (exUser) {
req.flash('joinError', '이미 가입된 이메일입니다')
return res.redirect('/join')
}
await user.create({
email,
name,
password,
});
return res.redirect('/');
} catch (error) {
console.error(error);
return next(error);
}
});
//db 확인
router.get('/list', async(req,res)=>{
try{
const rows = await user.findAll();
if (rows) return res.status(200).json({result : rows});
else throw console.log(error);
} catch(err){
console.error(err);
}
});
//로그인 라우터
router.post('/login', isNotLoggedIn, (req,res,next)=>{
//로컬 로그인 전략 성공 시 수행되는 매서드
passport.authenticate('local', {session: false}, (authError, user, info)=>{
if (authError){
console.error(authError);
return next(authError);
}
if (!user) {
req.flash('login-error', info.message);
return res.redirect('/');
}
console.log(user);
return req.login(user, (loginError) =>{
if (loginError) {
console.error(loginError);
return next(loginError);
}
return res.redirect('/');
});
})(req, res, next);
});
//로그아웃 라우터
router.get('/logout', isLoggedIn, (req,res)=>{
req.logOut();
req.session.destroy();
res.redirect('/');
});
module.exports = router;
답변 1
0
passReqToCallback을 true로 하시면 (req, email, password, done) => { 이어야 합니다.
이게 req를 콜백에다가 추가하겠다는 의미라서요.