WhiteGaram
10
2021-06-12 01:26:08
3
166

node.js 에서 mysql 연동을 하여 ejs 파일로 불러올려고 하는데 오류가 뜹니다 살려주세요


error 는 TypeError : cannot read property ' rende' of undefined

var fs = require('fs');
var ejs = require('ejs');
var mysql = require('mysql');
var express = require('express');
var bodyParser = require('body-parser');

var client = mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'1234',
    database:'company',
    port:'3306' ,
    multipleStatements : true
});

var app = express();

app.use(bodyParser.urlencoded({extended:false}));
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

app.get('/',function(req,res){
    fs.readFile('./views/book_list','utf8',function(err,ejs){
        client.query('SELECT * FROM book',function(err,results){
            if(err){
                console.log('select all queart error');
                console.log(err);
            }else{
                res.send(ejs.render({data:results}));
            }
        });
    });
});
var fs = require('fs');
var ejs = require('ejs');
var mysql = require('mysql');
var express = require('express');
var bodyParser = require('body-parser');

var client = mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'1234',
    database:'company',
    port:'3306' ,
    multipleStatements : true
});

var app = express();

app.use(bodyParser.urlencoded({extended:false}));
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

app.get('/',function(req,res){
    fs.readFile('./views/book_list','utf8',function(err,ejs){
        client.query('SELECT * FROM book',function(err,results){
            if(err){
                console.log('select all queart error');
                console.log(err);
            }else{
                res.send(ejs.render({data:results}));
            }
        });
    });
});


book_list.ejs


<!DOCTYPE html>
<html>
<head>
    <title>타이틀</title>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE-edgd">
    <meta name ="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <h1>타이틀</h1>
    <a href="/insert">INSERT DATA</a>
    <form action="/getdata" method="GET">
        <table width="100%" border="1">
            <tr>
                <th>DELETE</th>
                <th>EDIT</th>
                <th>번호</th>
                <th>제목</th>
                <th>저자</th>
                <th>출판사</th>
                <th>발행일</th>
            </tr>
            <%
            for(var i=0; i<data.forEach; i++)  
            {
            %>
                <tr>
                    <td><a href="/delete/ <%= data.id %>">DELETE</a></td>
                    <td><a href="/edit/ <%= data.id %>">EDIT</a></td>
                    <td><%= data.book_id %></td>
                    <td><%= data.title %></td>
                    <td><%= data.publisher %></td>
                    <td><%= data.pub_date %></td>
                </tr>
            <%}%>
        </table>
    </form> 
</body>
</html>


0
  • 답변 3

  • Flex 해서 샀다
    232
    2021-06-12 02:04:51


    fs.readFile('./views/book_list','utf8',function(err,ejs){

    여기서 ejs 를 덮어서 생긴 문제입니다.

    Typescript 쓰시면 에디터가 잡아줬을 (빨간 밑줄 쭉! "이거 undefined 아닌가요?") 에러입니다

    https://eslint.org/docs/rules/no-shadow 같은 eslint 룰 적용시켜도 되긴 하지만...


    그치만 vscode + typescript 는 갓갓의 조합이니 정말 강추드립니다!!!!!


    (* eslint 쓰지 말라는 것은 아니고요... 저도 둘다 쓰지만 typescript 가 실제 버그 잡는게 더 많습니다ㅎㅎ)

  • sel
    193
    2021-06-12 09:43:08
    저렇게 콜백을 여러번 쓰시는거보단 Promise를 적용해보거나 쿼리 날린다음 fs.readFile 말고  res.render(‘book_list’, {data:results}) 함수로 간략하게 작성하는 방법도 추천드립니다.
  • Flex 해서 샀다
    232
    2021-06-12 12:08:13

    그리고 `const fs = require('fs/promises')` 하시면 위에 @sel 님 말씀대로 Promise 쓰는게 좋습니다

    (* promise 기반인 async-await  쓰면 더 좋고요(

  • 로그인을 하시면 답변을 등록할 수 있습니다.