首页 > 解决方案 > TypeError:无法读取 node.js 和 sqlite 中未定义的属性“名称”

问题描述

我正在尝试将数据插入到我的 sqlite 数据库中。如果我尝试插入它,我会收到一个未定义名称的错误。

我在这里似乎没有看到任何问题。

状态码是:500 Internal Server Error

module.exports = {
  setUsers: function(db, name, vorname, geburtsdatum, geschlecht) {
    const row = db.run("insert into users (name, vorname, geburtsdatum, geschlecht) values (?,?,?,?)", [name, vorname, geburtsdatum, geschlecht]);    
    return row['id'];
  },

  getUser: function(db, newID){
    const row = db.prepare("select name, vorname, geburtsdatum, geschlecht from users where id = ?", [newID]);
    return row;
  }
}

这是我的 SQL 文件。

我的 app.js 看起来像这样

 var express = require('express'); // Express web server framework
 var request = require('request'); // "Request" library
 var cors = require('cors');
 var querystring = require('querystring');
 var cookieParser = require('cookie-parser');
 var client_id = ''; // Your client id
 var client_secret = ''; // Your secret
 var redirect_uri = 'http://localhost:8888/callback'; // Your redirect uri
 //const db = require('better-sqlite3')('data/datifyme.db', {});
 const sqlite = require('sqlite3').verbose();
 var db = new sqlite.Database('./data/datifyme.db');
 const bodyparser = require('body-parser');
 var router = express.Router();
 var access_token;
 var refresh_token;
 var newID;
 const callbacks = require('./callbacks');
 const dbcrud = require('./sql');

 /**
  * Generates a random string containing numbers and letters
  * @param  {number} length The length of the string
  * @return {string} The generated string
  */
 var generateRandomString = function(length) {
   var text = '';
   var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
   for (var i = 0; i < length; i++) {
     text += possible.charAt(Math.floor(Math.random() * possible.length));
   }
   return text;
 };
 var stateKey = 'spotify_auth_state';
 var app = express();
app.use(express.static('public'))
    .use('/css', express.static(__dirname + 'public/css'))
    .use('/javascript', express.static(__dirname + 'public/javascript'))
    .use('/images', express.static(__dirname + 'public/images'))
    .use('/pages', express.static(__dirname + 'public/pages'))
    .use(cors())
    .use(cookieParser())
console.log('Listening on 8888');
app.listen(8888);
state = generateRandomString(16)
app.get('', (request, response) => {
  response.sendFile(__dirname + '/public/views/index.html');
  response.cookie(stateKey, state);
});
// https://github.com/thelinmichael/spotify-web-api-node

app.get('/login', function(req, res){
  var SpotifyWebApi = require('spotify-web-api-node');
  const { Console } = require('console');
  // credentials are optional
  var spotifyApi = new SpotifyWebApi({
    clientId: client_id,
    clientSecret: client_secret,
    redirectUri: redirect_uri
  });
  // Get an access token and 'save' it using a setter
  spotifyApi.clientCredentialsGrant().then(
    function(data) {
      access_token = data.body['access_token'];
      refresh_token  = data.body['refresh_token'];
      spotifyApi.setAccessToken(data.body['access_token']);
      callbacks.getSpotifyUser(spotifyApi)
      let scopes = ['user-read-private', 'user-read-email', 'user-top-read'],
      //state = generateRandomString(16),
      showDialog = true,
      responseType = 'code';
    // Create the authorization URL
    var authorizeURL = spotifyApi.createAuthorizeURL(
      scopes,
      state,
      showDialog,
      responseType
    );
  res.redirect(authorizeURL);
  },
    function(err) {
      console.log('Something went wrong!', err);
    }
  );
});

app.get('/callback', function(req, res) {
  // your application requests refresh and access tokens
  // after checking the state parameter
  var code = req.query.code || null;
  if (code === null) {
    res.redirect('/#' +
      querystring.stringify({
        error: 'state_mismatch'
      }));
  } else {
    res.clearCookie(stateKey);
    var authOptions = {
      url: 'https://accounts.spotify.com/api/token',
      form: {
        code: code,
        redirect_uri: redirect_uri,
        grant_type: 'authorization_code'
      },
      headers: {
        'Authorization': 'Basic ' + (new Buffer(client_id + ':' + client_secret).toString('base64'))
      },
      json: true
    };
    request.post(authOptions, function(error, response, body) {

      if (!error && response.statusCode === 200) {
            access_token = body['access_token'];
            refresh_token = body.refresh_token;
        var options = {
          url: 'https://api.spotify.com/v1/',
          headers: { 'Authorization': 'Bearer ' + access_token },
          json: true
        };
        // // use the access token to access the Spotify Web API
        // we can also pass the token to the browser to make requests from there
        let url  = '/#' +
        querystring.stringify({
          access_token: access_token,
          refresh_token: refresh_token
        })
        res.redirect(url);
      } else {
        res.redirect('/#' +
          querystring.stringify({
            error: 'invalid_token'
          }));
      }
    });
  }
});
app.post('/submit', function(req, res){
    var name = req.body.name;
    var vorname = req.body.vorname;
    var geburtsdatum = req.body.geburtsdatum;
    var geschlecht = req.body.geschlecht;
    newID = dbcrud.setUsers(db, name, vorname, geburtsdatum, geschlecht);  

  res.redirect('/pages/konto.html#' +
    querystring.stringify({
      access_token: access_token,
      refresh_token: refresh_token      
    }));
});
app.get('/users', function(req, res){
  row = dbcrud.getUser(db, newID);
  console.log(row);
  res.send(row);
});

这是我的表格

<!DOCTYPE html>
<html lang="de-CH">
  <head>
    <title>Infos vervollständigen</title>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="../css/infromationen.css">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@200&family=Noto+Sans+JP:wght@100&family=Roboto:wght@100&display=swap" rel="stylesheet">
  </head>
  <body>
    <div id="container">
      <h1>Profil vervollständigen</h1>
      <form method="POST" action="/submit">
        <label for="name">Name*</label>
        <input type="text" id="name" name="name" required><br>
        <label for="vorname">Vorname*</label>
        <input type="text" id="vorname" name="vorname" required>
        <fieldset>
          <legend>Geburtsdatum*</legend>
          <input type="date" name="geburtsdatum" required>
        </fieldset>
        <fieldset>
          <legend>Geschlecht*</legend>
          <input type="radio" id="male" name="geschlecht" value="männlich" required>
          <label for="male">Männlich</label>
          <input type="radio" id="female" name="geschlecht" value="weiblich">
          <label for="female">Weiblich</label>
          <input type="radio" id="diverse" name="geschlecht" value="divers">
          <label for="diverse">Divers</label>
        </fieldset>
        <p>* Pflichtfeld</p>
        <input type="submit" id="senden" value="Senden">
      </form>
    </div>
  </body>
</html>

一般来说,我对 node.js 和 javascript 相当陌生。

如果有人有想法,我会非常感激。

更新 我没有使用 bodyparser,虽然我需要它。这是丢失的:

    .use(bodyparser.json())
    .use(bodyparser.urlencoded({extended: true}));

它是这样工作的。

标签: javascriptnode.jssqlite

解决方案


推荐阅读