草庐IT

postgresql - 无法获取 Go http 返回错误; 'No data recieved'

coder 2024-07-11 原文

我正在尝试使用 Go 构建一个基本 API,它使用 PostgreSQL library 返回 SQL 查询的结果。 .

目前我可以让程序返回值,但我无法让它向用户返回失败的消息,即一些带有错误消息的 JSON。

我有一个错误函数如下:

func handleError(w http.ResponseWriter, err error) {
    if err != nil {
        log.Print(err.Error() + "\r\n") // Logging
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

但是 http.Error 方法似乎没有返回任何东西。抛出的错误是数据库中不存在的表(记录到文本文件中:即 2016/01/11 23:28:19 pq:关系“building_roof”不存在

我的程序查询代码如下所示:

table := pq.QuoteIdentifier(table)
identifier := pq.QuoteIdentifier("ID")
rows, err := db.Query( fmt.Sprintf("SELECT %s, ST_AsText(geom) FROM %s WHERE %s = $1", identifier, table, identifier), feature)
handleError(w, err)

导致错误只会导致 Chrome 错误:

没有收到数据

ERR_EMPTY_RESPONSE

编辑完整代码:

package main

import (
    "fmt"
    "encoding/json"
    "os"
    "log"
    "net/http"
    "database/sql"
    "strings"
    "time"
    "github.com/lib/pq"
)


func handler(w http.ResponseWriter, r *http.Request) {

    f, err := os.OpenFile("pgdump_errorlog.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
    log.Print("Couldn't open file")
    defer f.Close()
    log.SetOutput(f)

    // Timing
    start := time.Now()

    // Postgres Credentials
    const (
        DB_USER     = "postgres"
        DB_PASSWORD = "OMITTED" // Removed details !
        DB_PORT     = "OMITTED"
        DB_NAME     = "OMITTED"
    )

    // Postgres Connect
    dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s port=%s sslmode=disable",
                           DB_USER, DB_PASSWORD, DB_NAME, DB_PORT)
    db, err := sql.Open("postgres", dbinfo)
    handleError(w, err)
    defer db.Close()

    table := r.FormValue("table")
    feature := r.FormValue("id")
    if table != "" {

        //Postgres Query
        var (
            id int
            geom string
        )

        table := pq.QuoteIdentifier(table)
        identifier := pq.QuoteIdentifier("ID")
        rows, qerr := db.Query( fmt.Sprintf("SELECT %s, ST_AsText(geom) FROM %s WHERE %s = $1", identifier, table, identifier), feature)
        handleError(w, err)
        defer rows.Close()
        for rows.Next() {
            err := rows.Scan(&id, &geom)
            handleError(w, err)
        }
        err = rows.Err()
        handleError(w, err)

        // Maniplate Strings
        returngeom := strings.Replace(geom, "1.#QNAN", "", -1)
        i := strings.Index(returngeom, "(")
        wkt := strings.TrimSpace(returngeom[:i])
        returngeom = returngeom[i:]

        type WTKJSON struct {
            WTKType   string
            Geometry  string
            Elapsed   time.Duration
        }

        returnjson := WTKJSON{Geometry:  returngeom, WTKType: wkt , Elapsed: time.Since(start)/1000000.0}
        json.NewEncoder(w).Encode(returnjson)

    }

}

func handleError(w http.ResponseWriter, err error) {
    if err != nil {
        log.Print(err.Error() + "\r\n") // Logging
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}


func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

最佳答案

以下似乎允许我返回 JSON 错误:

func handleError(w http.ResponseWriter, err string) {
    type APIError struct {
        Error string
    }
    re, _ := json.Marshal(APIError{Error: err})
    io.WriteString(w, string(re))
}

这样使用:

rows, err := db.Query( fmt.Sprintf("SELECT %s, ST_AsText(geom) FROM %s WHERE %s = $1", identifier, table, identifier), feature)
        if err != nil {
            handleError(w, err.Error())
            return
        }

并不是说这是最好的方法,但对我来说很有效。

关于postgresql - 无法获取 Go http 返回错误; 'No data recieved',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34733120/

有关postgresql - 无法获取 Go http 返回错误; 'No data recieved'的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  10. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

随机推荐