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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

672閲覧

javascriptでsqlite3操作中に、他のfunctionの定義を参照したい

sdk

総合スコア4

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/06/03 01:42

前提・実現したいこと

javascriptでsqlite3を触ってみているんですが、分からない所があるのでご質問させていただきます。(何分学習し始めて日が浅いので、根本的な所ならすみません)

sqlite3操作中に、別のfunctionの変数を読み込みたいのですが、うまくいかず困っています。

以下のソースコードで最終行のnew ReadAllRows()をした時に、this.arrを読み込みたいです。

発生している問題・エラーメッセージ

TypeError: Cannot read property 'push' of undefined

該当のソースコード

javascript

1'use strict' 2 3function Constract () { 4 this.argv = require('minimist')(process.argv.slice(2)) 5 this.sqlite3 = require('sqlite3').verbose() 6 this.db = new this.sqlite3.Database('memo_db.sqlite3') 7 this.arr = [] 8} 9 10function RunMemo() { 11 if (this.argv.l || this.argv.r || this.argv.d) { 12 console.log('RunMemo OK') 13 } 14} 15 16function ReadAllRows() { 17 if (this.argv.r || this.argv.d) { 18 this.db.all('SELECT rowid, ? FROM memos', [`body`], function(err, rows) { 19 20 if (err) { console.log(err) } 21 for (const row of rows) { 22 this.arr.push(row.body) 23 } 24 }) 25 } 26} 27 28RunMemo.prototype = new Constract() 29new RunMemo() 30 31ReadAllRows.prototype = Object.create(RunMemo.prototype) 32new ReadAllRows()

試したこと

thisが読み込めていないからだと考え、this.db.all(...).bind(this)などしてみましたが、TypeError: this.db.all(...).bind is not a functionとエラーが出ます。

function ReadAllRows()の直下にconst arr = []と書くと、arr.push(row.body)が成功します。

補足情報(FW/ツールのバージョンなど)

nodejs : v12.16.1
sqlite3 : 4.2.0
macOS : 10.13.6

数日悩んでいますがどうしても分からず、、今回こちらに投稿してみました。
どうかよろしくおねがいします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは、アロー関数を使ってみてはどうでしょうか?

Javascript

1function ReadAllRows() { 2 if (this.argv.r || this.argv.d) { 3 this.db.all("SELECT rowid, ? FROM memos", [`body`], (err, rows) => { 4 if (err) { 5 console.log(err); 6 } 7 for (const row of rows) { 8 this.arr.push(row.body); 9 } 10 }); 11 } 12}

投稿2020/06/03 05:52

fake_shibe

総合スコア806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sdk

2020/06/03 06:50

おお、、ありがとうございます。 アロー関数はただの違う書き方だと思ってました。 今調べますと、「関数の外のthisを関数内で参照できる」とありました。 それに「IEでは使えない」とも。。 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問