postgres で基本的な luminus テンプレートをセットアップしました。この本の第6章p.168の例に従って、新しいユーザーを追加して認証できるようにしたい: https://pragprog.com/titles/dswdcloj3/web-development-with-clojure-third-edition /
問題があったので、この部分を乗り越えるために新しいプロジェクトをやり直しました。
新しい luminus プロジェクトを作成し、データベース テーブルを作成し、project.clj ファイルを更新しました。テスト ユーザーを作成しようとすると、エラーが発生します。
次のコマンドを実行しました。
lein new luminus testproject --template-version 3.91 -- +postgres +http-kit
cd testproject
lein repl
別の端末で、私はそうします
psql
CREATE USER testproject WITH PASSWORD 'password';
CREATE DATABASE testproject WITH OWNER testproject;
dev_config.edn ファイルを更新しました。
{:dev true
:port 3000
:nrepl-port 7000
:database-url "postgresql://localhost:5432/testproject?user=testproject&password=password"
}
それから私はやった
lein repl
(start)
(create-migration "add-users-table")
(migrate)
(in-ns 'testproject)
(create-user! "testuser" "testpass")
次のエラーが表示されます。
Unable to resolve symbol: create-user! in this context
私が編集/作成したファイル: project.clj (仲間を追加)
auth.clj:
(ns testproject.core
(:require
[buddy.hashers :as hashers]
[next.jdbc :as jdbc]
[testproject.db.core :as db]))
(defn create-user! [login password]
(jdbc/with-transaction [t-conn db/*db*]
(if-not (empty? (db/get-user-for-auth* t-conn {:login login}))
(throw (ex-info "User already exists!"
{:testproject/error-id ::duplicate-user
:error "User already exists!"}))
(db/create-user!* t-conn
{:login login
:password (hashers/derive password)}))))
(defn authenticate-user [login password]
(let [{hashed :password :as user} (db/get-user-for-auth* {:login login})]
(when (hashers/check password hashed)
(dissoc user :password))))
クエリ.sql:
-- :name create-user!* :! :n
-- :doc creates a new user with the provided login and hashed password
INSERT INTO users
(login, password)
VALUES (:login, :password)
-- :name get-user-for-auth* :? :1
-- :doc selects a user for authentication
SELECT * FROM users
WHERE login = :login
移行: ユーザー テーブルを追加:
CREATE TABLE users
(login text PRIMARY KEY,
password text not null,
created_at TIMESTAMP not null DEFAULT now());
users テーブルを下に追加します。
DROP TABLE users;
メッセージ/投稿を問題なく追加できました。このテストプロジェクトでは、新しいユーザーが問題を切り分けようとしているだけです。
私は何を間違っていますか?どの部分に注意すればよいですか?
ありがとう。