通过更新处理程序向 couchDB 提交表单不起作用

Posted

技术标签:

【中文标题】通过更新处理程序向 couchDB 提交表单不起作用【英文标题】:Submitting form to couchDB through update handler not working 【发布时间】:2013-07-28 12:43:13 【问题描述】:

我无法通过更新处理程序发布到 CouchDB,我不知道我做错了什么。以下是长篇描述。

我使用 erica 创建了一个应用程序,其详细信息主要来自 wiki。它工作得很好,直到我决定去发布,但是服务器端,通过更新处理程序根据Apache CouchDB wiki Working_with_Forms

我用 erica 创建了一个新的“webapp”,构建了一个索引(从 wiki 剪切-n-粘贴,稍作改动):

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Minimal Form</title>
</head>

<body>
<div id="contact-form">
  <form id="contact" method="post" action="/mydatabase/_design/mydesigndoc/_update/postForm" enctype="multipart/form-data">
    <fieldset>
        <label for="name">name</label>
        <input type="text" name="name" placeholder="Full Name" title="Enter your name" class="required">

        <label for="phone">phone</label>
        <input type="tel" name="phone" placeholder="+1 (555) 555-5555" required="" pattern="\+?[0-9 )(-]+">

        <label for="email">e-mail</label>
        <input type="email" name="email" placeholder="you@example.org" title="e-mail address" class="required email">

        <label for="blog">blog</label>
        <input type="url" name="url" placeholder="http://">

        <label for="message">message</label>
        <textarea name="message"></textarea>

        <input type="submit" name="submit" class="button" id="submit" value="submit">
    </fieldset>
  </form>
</div>

我将表单属性action= 更改为:htttp://localhost:5984/DBNAME/_design/DESIGNDOCID/_update/UPDATENAME 并添加了enctype="multipart/form-data"

然后根据 wiki 构建了一个 _design 文档,如下所示:


updates: 
    postForm: function(previous, request) 

        /* during development and testing you can write data to couch.log
    log("previous": previous)
    log("request": request)
    */
    var doc = 
    if (!previous) 
            // there's no existing document _id as we are not using PUT
            // let's use the email address as the _id instead
            if (request.form && request.form.email) 
                // Extract the JSON-parsed form from the request
                // and add in the user's email as docid
                doc = request.form
                doc._id = request.form.email
            
        
        return [doc, toJSON(
            "request": request,
            "previous": previous,
            "doc": doc
        )]
    


这是放在“ddoc”文件夹中,用erica推送应用程序,根据链接打开网页,找到表单但是提交时得到的答案是这样的:

"error":"unnamed_error","reason":"(new TypeError(\"point is undefined\", \"/usr/share/couchdb/server/main.js\", 1475))"

我已经摆弄了 action="..." 属性,甚至像这样放置绝对地址:

http://localhost:5984/mydatabase...

我已将 toJSON() 替换为 JSON.stringify()。

我已重新启动该过程并重新完成该项目。无济于事。

我有一种明显的感觉,我已经“失明”了,解决方案可能就在我眼前,但我看不到它。似乎POST-http-request没有问题,因为我之前尝试过AJAX时服务器已经抱怨过(忘记了“content-type”),但这次似乎是内部服务器问题。我不知道。真的。

总而言之,问题是:有人可以帮助我吗?请。

【问题讨论】:

我知道这是一个很长的描述。当我阅读了该网站上的各种帖子时,我发现最常见的评论是问题/描述含糊不清和/或需要详细说明。所以我做了。是不是太长/太详细了?我应该减少它以获得答案吗? 我知道这是一个老问题,但既然你问:是的。请减少描述。仅包括相关细节。我已经为你做了一些编辑。 【参考方案1】:

我会回答我自己的问题,同时请那些浪费时间的人原谅。

我所做的是我通读了kanso 并理解了范围的概念如何适用于这种情况。这是在更新处理程序上使用exports 的问题,因此可以通过&lt;form action="/database/_design/designDocument/_update/updateFunction 访问它。

为什么我没有早点通读 Kan.so?好吧,我的想法是保持简单 - ericacouchapp 的继任者虽然我必须说文档很少,但是通过阅读 Kan.so 来揭开 couchapp 构建的魔力,除此之外,我还了解了其他一些漂亮的概念和技术。我弯下脖子表示感谢。

而且我希望所有花时间阅读我冗长且事实证明是不必要的问题的人会因我的无知而监督。

(现在我只想知道是否有某种管理员/版主可以处理我的作品以避免将来的时间 oss)

【讨论】:

谢谢。我遇到了同样的问题,您的回答将帮助我找到解决方法!【参考方案2】:

我也遇到了这个错误,正如@Pea-pod 所暗示的那样,导致它的原因是在 couchapp 的设计文档中没有正确定义您的 exports。在我们的例子中,它是无法调用的列表函数,而是在 couchdb 日志中显示 500 错误,Type errorpoint is undefined

我们使用 kanso 并且在 app.js 中我们不需要列表文件。我们有:

module.exports = 
    rewrites: require('./rewrites'),
    views: require('./views'),
    shows: require('./shows')
;

将其更改为以下解决了问题:

module.exports = 
    rewrites: require('./rewrites'),
    views: require('./views'),
    shows: require('./shows'),
    lists: require('./lists')
;

我可以建议版主更改此问题的标题以包含point is undefined,这是发生此类错误时在 CouchDB 日志中显示的错误,以帮助其他人更容易找到它?

【讨论】:

以上是关于通过更新处理程序向 couchDB 提交表单不起作用的主要内容,如果未能解决你的问题,请参考以下文章

通过 AJAX 更新 wordpress 表单第二次不起作用

JSP 表单处理向服务器提交信息

document.form.action,表单分向提交

couchdb/cloudant 更新处理程序未按预期工作

CouchDB 重写规则以更新处理程序导致 405 方法不允许

您可以将 CouchDB 的“文档更新处理程序”与复制一起使用吗?